2
我正在使用WPF的MVVM方法讓用戶選擇一個組合框中的一個項目。該模型包含一組可能的選項,組合框綁定到這個集合,當前選擇再次綁定到我的模型屬性。這部分工作正常。WPF MVVM:添加項目不存在組合框
現在我想允許用戶在組合框中輸入任意文本。如果文本與現有項目不一致,程序應詢問他是否要添加新項目。他也應該被允許取消該行動並選擇另一個項目。
我該如何在MVVM模式中做到這一點?
我正在使用WPF的MVVM方法讓用戶選擇一個組合框中的一個項目。該模型包含一組可能的選項,組合框綁定到這個集合,當前選擇再次綁定到我的模型屬性。這部分工作正常。WPF MVVM:添加項目不存在組合框
現在我想允許用戶在組合框中輸入任意文本。如果文本與現有項目不一致,程序應詢問他是否要添加新項目。他也應該被允許取消該行動並選擇另一個項目。
我該如何在MVVM模式中做到這一點?
您可以從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
值。