WPF MVVM:添加组合框中不存在的项目

时间:2011-03-20 11:33:49

标签: wpf mvvm combobox

我正在使用WPF的MVVM方法让用户在组合框中选择一个项目。该模型包含一组可能的选项,组合框绑定到此集合,当前选择再次绑定到我的模型的属性。这部分工作正常。

现在我想让用户在组合框中输入任意文本。如果文本与现有项目不对应,则程序应询问他是否要添加新项目。他也应该被允许取消行动并选择另一个项目。

我如何在MVVM模式中做到这一点?

1 个答案:

答案 0 :(得分: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添加一个事件处理程序,以显示相应的用户界面并相应地设置e.Outcome的值。