2009-06-08 12 views
4

OK、WPF(MVVMを使用)で作業し、質問に出くわしました、いくつかの入力が必要です。次に、ユーザがクリアするときWPFデータバインディングバインディングエラー通知

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

:私は、XAMLでそれにバインドしようと

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

:私は以下のような単純なクラス

を(私はIDataErrorInfoを実装していると仮定)を持ちます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に変更します。結局のところ、あなたのVMは、ビューをサポートするモデルを提供する必要があり、ビューはユーザーがstringを入力することを許可します。次に、解析された料金をintとして公開する別のプロパティを提供することができます。こうすることで、コンバージョンロジックがFeeプロパティに正しく登録され、再利用、デバッグ、および保守が容易になります。

+0

私はあなたに同意するかどうかわかりません。手数料はあなたが計算するためのプロパティであるようですので、数値でなければなりません。すべての数値フィールドは、文字列を受け入れるテキストボックスを介して入力されます。あなたが提案する方法では、数値を表すすべてのプロパティを文字列と数値の両方で実装する必要があります。コンバータを使用すると、変換コードを1回書く必要があります。 – Dabblernl

+1

変換コードを複数回記述する必要はありません。必要に応じて変換コードを取り除くだけです。しかし、通常、TryParseメソッドへの単純な呼び出しであるため、そこには痛みはありません。また、VMにコードを入れることで、デザイナーが再生するビューで間違ってしまうことも少なくなります。 –

関連する問題