UWP - 将 TextBox.Text 绑定到 Nullable<int>

7

目前在通用 XAML 应用程序中,绑定到任何 Nullable<T> 是不可能的,这个链接是从 2013 年的:

https://social.msdn.microsoft.com/Forums/en-US/befb9603-b8d6-468d-ad36-ef82a9e29749/textbox-text-binding-on-nullable-types?forum=winappswithcsharp

上面说到:

在 Windows 8 商店应用程序中,不支持绑定到可空值。它只是没有在此版本中实现。我们已经记录了下一个版本的这种行为错误。

但是真的不可能修复这个问题吗?

我的绑定代码:

<TextBox Text="{Binding Serves, Mode=TwoWay}" Header="Serves"/>

我的属性:

public int? Serves
{
    get { return _serves; ; }
    set
    {
        _serves = value;
        OnPropertyChanged();
    }
}

我得到的输出错误信息如下:

Error: Cannot save value from target back to source. 
BindingExpression: 
    Path='Serves' 
    DataItem='MyAssembly.MyNamespace.RecipeViewModel, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'; target element is 'Windows.UI.Xaml.Controls.TextBox' (Name='null'); target property is 'Text' (type 'String').
1个回答

11

看起来问题还没有解决。由于XAML使用内置的转换器,因此在这种情况下,您可以将其替换为自己的转换器,处理可空类型:

XAML:

<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel.Resources>
        <local:NullConverter x:Key="NullableIntConverter"/>
    </StackPanel.Resources>
    <TextBox Text="{Binding Serves, Mode=TwoWay, Converter={StaticResource NullableIntConverter}}" Header="Serves"/>
</StackPanel>

后台代码:

public class NullConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    { return value; }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        int temp;
        if (string.IsNullOrEmpty((string)value) || !int.TryParse((string)value, out temp)) return null;
        else return temp;
    }
}

public sealed partial class MainPage : Page, INotifyPropertyChanged
{
    private int? _serves;

    public event PropertyChangedEventHandler PropertyChanged;
    public void RaiseProperty(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));

    public int? Serves
    {
        get { return _serves; }
        set { _serves = value; RaiseProperty("Serves"); }
    }

    public MainPage()
    {
        this.InitializeComponent();
        DataContext = this;
    }
}

是的,那也是我的解决方法。我只是有点惊讶这还没有被实现。 - Troels Larsen
@TroelsLarsen 我猜他们只是负荷过重,有更重要的 bug 需要解决,因为这个可以很容易地绕过。类似的 bug,可以通过转换器轻松“修复”。 - Romasz
1
@Rommasz:没错。由于WPF和UWP的相似之处,这样的遗漏就更加显眼了。无论如何,感谢您的帮助! - Troels Larsen
截至2019年仍未修复。疯狂的是,一开始我没有任何问题。然后我将项目的目标版本更改为最新版本的Win10(最初它针对的是旧版本但不是那么旧),突然每个Nullable int绑定都会抛出“对象和可空int之间没有隐式转换”的错误... - Stuart Aitken
嗨@Romasz,我实现了你的解决方案,但是我得到了相同的错误。为了解决它,我已经改变了Convert方法,像这样:public object Convert(object value, Type targetType, object parameter, string language) { if (value == null) return value; return value.ToString(); } - Emanuele Leoni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接