在XAML \ Windows 8商店应用程序中数据绑定可以为空的类型

时间:2013-03-14 10:11:08

标签: c# data-binding windows-store-apps winrt-xaml ivalueconverter

我在XAML中有一个TextBox,我正在尝试将数据绑定到一个可以为空的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&amp; C#设计一个Windows应用商店。

提前致谢。

3 个答案:

答案 0 :(得分:6)

我同意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不同。

答案 1 :(得分:2)

在绑定句柄TargetNullValue中。有点像:

您需要添加mscorlib:

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

并像这样更新你的绑定:

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

实际上,如果在XAML中检查空值,则不需要NullableValueConverter。这当然取决于您的转换器可能应该处理的其他内容。

或者,您可以实施IDataErrorInfo。这有点复杂了。

答案 2 :(得分:2)

对于Windows应用商店应用,Binding类没有TargetNullValue属性。

菲尔的方法是有效的,并且工作正常,只要确保你按照他的建议使用正确的方法签名(正如你在自己的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;
    }
}