2011-03-20 5 views
2

Я использую подход MVVM с WPF, чтобы пользователь мог выбрать один элемент в поле со списком. Модель содержит набор возможных опций, combobox привязан к этому набору, текущий выбор снова привязан к свойству моей модели. Эта часть работает нормально.WPF MVVM: Добавить элемент, отсутствующий в combobox

Теперь я хочу разрешить пользователю вводить произвольный текст в поле со списком. Если текст не соответствует существующему элементу, программа должна спросить его, хочет ли он добавить новый элемент. Ему также должно быть разрешено отменить действие и выбрать другой элемент.

Как бы это сделать в шаблоне 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 представить соответствующий пользовательский интерфейс и установить значение e.Outcome соответственно.

Смежные вопросы