2011-03-20 30 views
2

私は、コンボボックスで1つの項目を選択できるようにWPFでMVVMを使用しています。モデルには可能なオプションのセットが含まれています。コンボボックスはこのセットにバインドされています。現在の選択は、再びモデルのプロパティにバインドされます。この部分はうまく動作します。WPF MVVM:コンボボックスに存在しない項目を追加します。

これで、ユーザーは任意のテキストをコンボボックスに入力できるようになりました。テキストが既存のアイテムに対応していない場合、プログラムは新しいアイテムを追加するかどうかを尋ねる必要があります。彼はまた、アクションをキャンセルし、別のアイテムを選択することを許可する必要があります。

MVVMパターン内ではどうすればよいですか?

答えて

1

あなたは、ViewModelのバウンドプロパティーセッターからテキストの「既存の」ステータスをチェックします。その時点で、イベントを起こし、何が起こるかに基づいて何をすべきかを決定する仕組みが必要です。

例:

enum Outcome { Add, Cancel } 

class BlahEventArgs : EventArgs 
{ 
    Outcome Outcome { get; set; } 
} 

class ViewModel 
{ 
    private string name; 

    public EventHandler<BlahEventArgs> NotExistingNameSet; 

    public Name 
    { 
     get { return this.name; } 

     set 
     { 
      if (/* value is existing */) { 
       this.name = value; 
       return; 
      } 

      var handler = this.NotExistingNameSet; 
      if (handler == null) { 
       // you can't just return here, because the UI 
       // will desync from the data model. 
       throw new ArgumentOutOfRangeException("value"); 
      } 

      var e = new BlahEventArgs { Outcome = Outcome.Add }; 
      handler(this, e); 
      switch (e.Outcome) { 
       case Outcome.Add: 
        // Add the new data 
        this.name = value; 
        break; 
       case Outcome.Cancel: 
        throw new Exception("Cancelled property set"); 
      } 
     } 
    } 
} 

あなたのビューには、適切なUIを提示し、それに応じてe.Outcomeの値を設定するNotExistingNameSetにイベントハンドラを追加します。

関連する問題