WPF MVVM: Добавить элемент, которого нет в выпадающем списке - PullRequest
2 голосов
/ 20 марта 2011

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

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

Как бы я это сделал в шаблоне MVVM?

1 Ответ

1 голос
/ 20 марта 2011

Вы бы проверили «уже существующий» статус текста из установщика связанных свойств 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 соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...