在XAMLWindows 8商店应用程序中绑定一个可空类型

本文关键字:一个 类型 绑定 XAMLWindows 应用程序 | 更新日期: 2023-09-27 18:03:56

我在XAML中有一个文本框,我试图将其绑定到一个可空的int。这是我的文本框和链接转换器的代码:

<TextBox x:Name="textArea" InputScope="Number" Text="{Binding Area, Mode=TwoWay, Converter={StaticResource NullableValueConverter}}" />
public class NullableValueConverter: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)
    {
        if (String.IsNullOrEmpty(value.ToString()))
        {
            return null;
        }
        return value;
    }
}

当每次我在这个文本框中输入一个数字时,数据绑定似乎不起作用,数据源总是保留为空。我怎样才能避开这个问题呢?

我用的是XAML &c#设计一个windows store应用程序。

在XAMLWindows 8商店应用程序中绑定一个可空类型

我同意Sacha的回答,但如果你需要一个NullableValueConverter一个改进将是

public class NullableValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          CultureInfo culture)
    {
        return value == null ? string.Empty : value.ToString();
    }
    public object ConvertBack(object value, Type targetType, object parameter, 
                              CultureInfo culture)
    {
        string s = value as string;
        int result;
        if (!string.IsNullOrWhiteSpace(s) && int.TryParse(s, out result))
        {
            return result;
        }
        return null;
    }
}

请注意,这是使用WPF测试的,因此方法签名可能与WinRT不同。

在你的绑定句柄TargetNullValue。有点像:

需要添加mscorlib:

 xmlns:sys="clr-namespace:System;assembly=mscorlib"

并像这样更新你的绑定:

 Source="{Binding Area,
          TargetNullValue={x:Static sys:String.Empty},
          Converter={StaticResource NullableValueConverter}}"

实际上你不需要NullableValueConverter如果你检查一个空值在你的XAML。当然,这取决于你的转换器还可能处理什么。

或者你可以实现IDataErrorInfo。这有点复杂。

Windows Store应用程序的Binding类中没有TargetNullValue属性

Phil的方法是有效的,它工作得很好,只要确保你按照他的建议使用正确的方法签名(就像你在自己的NullableValueConverter版本中所做的那样):

public class NullableValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return value == null ? string.Empty : value.ToString();
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        string s = value as string;
        int result;
        if (!string.IsNullOrWhiteSpace(s) && int.TryParse(s, out result))
        {
            return result;
        }
        return null;
    }
}