2009-06-08 72 views
4

好吧,使用WPF(使用MVVM)并遇到问题,需要一些输入。我有一个简单的类WPF数据绑定绑定错误通知

像下面(假设我已经IDataErrorInfo的实现):

public class SimpleClassViewModel 
{ 
    DataModel Model {get;set;} 
    public int Fee {get { return Model.Fee;} set { Model.Fee = value;}} 
} 

我再尝试绑定到它在XAML:

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

当用户然后清除出文本,发生数据绑定错误,因为它不能将string.empty转换为int。那么,费是一个必填字段,但由于数据绑定不会转换回来,我不能提供错误信息,因为我的类没有更新。那么我需要做到以下几点?

public class SimpleClassViewModel 
{ 
    DataModel Model {get;set;} 
    int? _Fee; 
    public int? Fee 
    { 
    get { return _Fee;} 
    set { _Fee = value;if (value.HasValue) { Model.Fee = value;} 
    } 
} 

回答

5

这可以使用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> 
2

你也可以利用你在做MVVM事实并将Fee属性的类型更改为string。毕竟,您的虚拟机应该提供支持该视图的模型,并且该视图允许用户输入string。然后,您可以提供一个单独的财产,将分析的费用公开为int。这样,您的转换逻辑就在Fee属性中,从而更易于重用,调试和维护。

+0

我不确定我是否同意你的看法。该费似乎是你将进行计算的财产,所以应该是数字。所有数字字段将通过接受字符串的文本框进入。你提出它的方式,你将不得不实现所有代表具有字符串和数字变体的数字的属性。使用转换器,您只需编写一次转换代码即可。 – Dabblernl 2009-06-09 10:39:05

+1

没有理由必须不止一次地写入转换代码 - 只是在必要时将其分解。然而,通常这只是一个简单的调用TryParse方法,所以在这里没有任何问题。而且,将代码放入虚拟机意味着更少的设计师可以在视图中出错。 – 2009-06-09 12:45:04