2011-03-20 70 views
2

我正在使用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"); 
      } 
     } 
    } 
} 

您的視圖將增加一個事件處理NotExistingNameSet呈現適當的UI,並相應設置的e.Outcome值。