2

我在 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 和 C# 来设计一个 Windows 商店应用程序。

提前致谢。

4

3 回答 3

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

于 2013-03-14T10:33:39.873 回答
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。这有点复杂。

于 2013-03-14T10:24:02.300 回答
2

Windows 应用商店应用程序的类没有TargetNullValue属性。Binding

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;
    }
}
于 2013-03-15T06:05:45.107 回答