2016-04-27 19 views
1

「モデルデータの検証担当者」などのことがわからないため、ちょっと混乱します。それに例を与えることをMVVM - 責任者

を私は人と特定のデバイスとの間の関係を可視化取得しているアプリケーションを持っています。

public class Person{ 
    public string Firstname {get; set;} 
    public string Lastname {get; set;} 
    public SomeSortOfDevice SomeSortOfDevice {get; set;} 
} 

public class SomeSortOfDevice{ 
    public DateTime DeviceExpiration {get; set;} 
    public string DeviceSerialCode {get; set;} 
    //public bool IsSerialCodeValid{get{ 
    //  SomeValidationLogic() 
    //} 
} 

ビューでは、App-Userはデバイスのデータを変更できます。 いくつかのルールがあります。たとえば、DeviceExpirationがTextBoxにバインドされていますが、有効なSerialCodeが設定されている場合にのみ有効にする必要があります。

しかし、誰がSerialCodeが有効かどうかを決定しますか?モデルそのもの? ViewModel?モデルに余分なプロパティ "IsSerialValid"を保持するか、TextBoxのIsEnabledプロパティをそのルールにバインドする方法はありますか?

編集1

public class ViewModel{ 
    public Person SelectedPerson {get; set;} 
} 

私は上記のモデルを使用すると思いますか厥 - ViewがSeletedPersonにいくつかのバインディングを取得します。

編集2

私はそれが私が前にそれを説明したよりも、リッテもう少しcomplicatenだと思います。デバイスがトークンであると仮定し、ユーザが何かを入力したかどうかを判断したいと思います。何か入力した場合、それは有効ですか?

検証がモデルは次のようになります(私は、現時点ではそれを持っているとして)モデルで扱われるべき場合:ユーザーが入力(または選択してくださいテキストボックスを有効にするために今すぐ

public Token{ 
    public DateTime ExpirationDate {get; set;} 
    public string Serial {get; set;} 
    public bool IsTokenExpired{ 
     get{ 
      return ExpirationDate.Date < DateTime.Now; 
     } 
    } 
    public bool IsTokenValid{ 
     get{ 
      return new Regex("[0-9]{8,12}").Match().Success; 
     } 
    } 
    public bool IsTokenSet{ 
     get{ 
      return TokenSerial.Length > 0; 
     } 
    } 
} 

)aバインディングの日付:

<TextBox IsEnabled="{Binding SelectedPerson.Token.IsTokenValid}"/> 

これはうまくいきますが、実際にはモデル内の検証ルールについては気にしません。

+0

'ViewModel'がバリデーションを処理する必要があります – bit

+0

バリデーションが成功した場合に実行するコマンドを表示できますか? – bit

+1

IDataErrorInfoを見ると、WPFコントロールがそれをサポートしています。 –

答えて

0

追加のプロパティを保持する必要はありません。 INotifyPropertyChangedインタフェースを実装するだけで、プロパティ値が変更されたときにイベントを送出します。

ビューモデルでプロパティのプロパティ変更イベントをリッスンし、そこでチェックすることができます。これはMVVMモデルでもビューが更新される方法です。

また、テキストボックスのIsEnabledプロパティを有効な値が含まれている場合、チェック中に設定されたviewmodelプロパティにバインドすることもできます。

IsEnabledプロパティにコンバーターを使用し、コマンドパラメーターとしてテキストを渡すこともできます。これにより、コンバータはテキストをチェックし、必要に応じてtextboxのIsEnabledプロパティのbool値を設定します。

+0

これは質問です。入力を検証して、それをブール値として表現したい場合は、検証または会話ですか?私のViewModelは10個の追加のプロパティ "IsFileOneValid"などを処理して、他のコントロールを他のコントロールに通知しなければならない場合、すべてのTBが有効なファイルパスを保持している場合、ボタンを有効にする必要があります。検証ステータスについての表示? – C4p741nZ

+0

いいえ、1つのプロパティを使用して管理することはできません。プロパティーまたはクラスのプロパティー変更イベントをリッスンし、イベントが発生したときに検査を行い、ブール値をtrueまたはfalseに設定することができます。 このboolプロパティは、ボタンのIsEnabledプロパティによってバインドされています。したがって、1つのテキストボックスが無効であっても、プロパティはfalseになり、ボタンは非アクティブになります。 – ViVi

1

私はそれがすべて特定のデザインに依存すると思います。一般的に、モデルにはいくつかのロジックチェックを実装できますが、モデルはUIと通信してはならない(できない)必要があります。したがって、モデルは何かが間違っているとデータを保存することを拒否します。

コードで正しく示唆したように、コントロールの可視性はViewModelで処理する必要があります。ただし、不正なシリアルコードを入力した場合、IsValidプロパティは変更されません(オンデマンドで計算されるため)。より良い方法は、DeviceSerialCodeのセッターでシリアルコードをチェックし、そこからIsSerialCodeValidを設定することです。 UIが変更を反映するためには、ViewModelもINotifyPropertyChangedインタフェースを実装し、設定子のプロパティに変更を通知する必要があります。

+0

モデルがビューと通信してはならないとすれば、それは参照するのが正しくないことを意味します。 SelectedPerson.Firstname(SelectedPersonは型Person(Model)です)ではなく、ビューモデル自体に特別なfirstnameプロパティを実装していますか?これは混乱の原因となるようです... – C4p741nZ

+0

データバインディングでモデルオブジェクトを参照するのは大丈夫だと思いますが、一般的には、いくつかのUIプロパティを反映するモデルに余分なフィールドを作成すべきではありません(例:要素の可視性など)。 )。モデルは問題のドメインを反映する必要があり、viewmodelはすべてのビューロジックを処理する必要があります。 –

2

これは単なる意見ですが、これが私のやり方です。

まず、あなたのモデルは、あなたのViewModelあなたがテキストボックスにバインドさ性質を持っているだろうし、あなたがそこにチェックをやる、のようなもので、その後public bool ValidateSerial(string serial);

のようなものを検証メソッドを持っている必要があります

_private string _serialNumber; 
public string SerialNumber 
{ 
    get 
    { 
     return this._serialNumber; 
    } 
    set 
    { 
     this._serialNumber=value; 
     RaisePropertyChanged("SerialNumber"); 
     this.IsSerialValid=Model.ValidateSerial(string serial); 
     RaisePropertyChanged("IsSerialValid"); 
    } 
    public bool IsSerialValid { get; set;} 
} 

IsSerialValidプロパティは、他のTextBoxのIsEnabledプロパティにバインドするプロパティです。

これはあなたにとって意味をなさないことを望みます。

+0

これは、私がmomenに持っている解決策によく似ています。私の編集で述べたように、私はこれには本当に満足していません。 – C4p741nZ

+0

この場合、SerialNumberはViewModelのプロパティになります。 SerialNuberが既にモデルの中に入っていれば? – C4p741nZ

+0

モデルはプロパティではなく、検証メソッドです。 @Chill-Xを混乱させるように名前を変更しました – Pikoh

関連する問題