WPF数据绑定错误通知

WPF数据绑定错误通知,wpf,data-binding,mvvm,Wpf,Data Binding,Mvvm,好的,在处理WPF(使用MVVM)时遇到了一个问题,需要一些输入。我有一节简单的课 如下所示(假设我已实现IDataErrorInfo): 然后我尝试用xaml绑定到它: <TextBox Text={Binding Fee, ValidatesOnDataErrors=true}/> 这可以使用ValueConverter完成: using System.Windows.Data; namespace MyNameSpace { class IntToStringCon

好的,在处理WPF(使用MVVM)时遇到了一个问题,需要一些输入。我有一节简单的课

如下所示(假设我已实现IDataErrorInfo):

然后我尝试用xaml绑定到它:

<TextBox Text={Binding Fee, ValidatesOnDataErrors=true}/>

这可以使用ValueConverter完成:

using System.Windows.Data;

namespace MyNameSpace
{
    class IntToStringConverter:IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((int) value).ToString();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            int result;
            var succes = int.TryParse((string) value,out result);
            return succes ? result : 0;
        }
    }
}
您可以在XAML中引用它,因此:

<Window xmlns:local="clr-namespace:MyNameSpace">
   <Window.Resources>
      <local:IntToStringConverter x:Key="IntConverter"/>
   </Window.Resources>
   <TextBox Text={Binding Fee, ValidatesOnDataErrors=true,
            Converter={StaticResource IntConverter}}/>
</Window>


您还可以利用正在进行MVVM的事实,将
费用
属性的类型更改为
字符串
。毕竟,您的虚拟机应该提供一个支持视图的模型,并且视图允许用户输入
字符串
。然后,您可以提供一个单独的属性,将解析后的费用公开为
int
。这样,您的转换逻辑就在
Fee
属性中,便于重用、调试和维护。

我不确定是否同意您的看法。费用似乎是你将用来计算的财产,因此应该是数字。所有数字字段都将通过接受字符串的文本框输入。按照您提出的方式,您必须使用字符串和数字变量实现所有表示数字的属性。使用转换器,你必须只写一次转换代码。没有理由你必须写多次转换代码——只要根据需要把它考虑进去就行了。然而,通常情况下,它只是对TryParse方法的一个简单调用,因此不会带来任何麻烦。此外,将代码放在VM中意味着在视图中出错的可能性更小,设计者将在视图中进行操作。
using System.Windows.Data;

namespace MyNameSpace
{
    class IntToStringConverter:IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((int) value).ToString();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            int result;
            var succes = int.TryParse((string) value,out result);
            return succes ? result : 0;
        }
    }
}
<Window xmlns:local="clr-namespace:MyNameSpace">
   <Window.Resources>
      <local:IntToStringConverter x:Key="IntConverter"/>
   </Window.Resources>
   <TextBox Text={Binding Fee, ValidatesOnDataErrors=true,
            Converter={StaticResource IntConverter}}/>
</Window>