2009-06-08 58 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