【问题标题】:Databind a nullable type in XAML\Windows 8 store app在 XAML\Windows 8 商店应用程序中绑定一个可为空的类型
【发布时间】:2013-03-02 15:05:21
【问题描述】:

我在 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 商店应用程序。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 您好菲尔,感谢您的回复。请查看我对 Sascha 帖子的评论
    • 没问题。考虑一下,您可以删除 !string.IsNullOrWhiteSpace 因为 int.TryParse 将为 null 或空白返回 false。
    【解决方案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。这有点复杂。

    【讨论】:

    • 感谢您的回复。当我添加引用时,它会抱怨以下错误:未定义的 CLR 命名空间。 “clr-namespace” URI 引用了无法找到的命名空间“System”。我正在为此应用程序使用窗口表面 RT 设备。不确定它会改变什么?
    • 在文件后面的一些代码中,右键单击String 键入关键字并选择“转到定义”。这应该会打开定义类型的类的元数据。在顶部,您将看到程序集名称,当然还有命名空间。如果它们与提到的值不同,请替换绑定中的那些。
    • 好的,我现在添加了以下参考: xmlns:sys="clr-namespace:System;assembly=System.Runtime" 并且编译器接受了这个。我现在收到以下错误:无法识别或无法访问成员“TargetNullValue”。我需要另一个参考来获取 TargetNullValue 吗?
    • 在 WPF 中 TargetNullValue 在 PresentationFramework.dll 中定义为 System.Windows.Data.BindingBase 的成员。好吧,我猜这对你没有多大帮助。在 ObjectCatalog 中搜索 TargetNullValue 并查看它是否在您尚未在项目中引用的程序集中定义。我不知道 WinRT 与 WPF 有很大不同。无论如何 - 如果该 ObjectCatalog 搜索不成功,我建议实施 Phils 解决方案,因为它是有效的,而且显然少了很多麻烦。
    【解决方案3】:

    Windows 应用商店应用的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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2012-09-28
      相关资源
      最近更新 更多