WPF, MVVM и комбинированный список - PullRequest
3 голосов
/ 30 июня 2011

У меня проблемы с логикой comboBox в моей модели представления. Модель представления заполняет поле со списком, и пользователь может выбирать элементы.

Когда элемент выбран, некоторая редактируемая информация появляется в представлении, и они могут вносить изменения. Теперь я хочу предложить пользователю сохранить, если изменения были внесены, а не сохранены, и они пытаются выбрать другой элемент в раскрывающемся списке («Сохранить?», Да / нет / отменить messageBox).

Прямо сейчас мне нужно запомнить ранее выбранный элемент и обработать его самостоятельно, сбросив выбранный элемент, если пользователь выбрал отмену. Поскольку comboBox не имеет события PreviewSelectionChanged, это единственный способ, который я могу придумать для обработки этого сценария. Это работает, но становится немного грязно, когда есть несколько комбинированных списков и т. Д.

Я что-то упускаю или это так, как нужно?

Ответы [ 3 ]

2 голосов
/ 30 июня 2011

Вы, по сути, должны сделать флаг в вашей модели представления под названием isDirty или что-то в этом роде.

public class EditorViewModel
{
    private bool _isDirty = false;

    private long _editableProperty;
    public long EditableProperty
    {
        get { return _editableProperty; }
        set
        {
            _editableProperty = value;

            // We've detected a change so mark this view model as dirty.
            _isDirty = true;
        }
    }
}

Обратите внимание, что вам придется перепрыгнуть через несколько обручей, если вы хотите убедиться, что данные на самом деле отличаются от ваших оригиналов. Допустим, кто-то случайно добавил пробел в EditableProperty и удалил его, ваша модель представления сочтет его грязным и предложит пользователю.

1 голос
/ 30 июня 2011

ComboBox Windows Forms предоставил событие SelectionChangeCommitted , но для элемента управления ComboBox WPF вы исправили то, что нет события, которое уведомит до изменения выбора, которое предоставит вам средство отмены событие.

Если вы собираетесь использовать отслеживание изменений / редактируемый подход, я бы порекомендовал рассмотреть возможность реализации IChangeTracking и IEditableObject для элементов в вашем источнике элементов списка.

Возможно, вам придется обработать событие SelectionChanged , проверить удаленные элементы , чтобы определить, был ли изменен ранее выбранный элемент, и затем отобразить диалоговое окно с запросом подтверждения. Если не было указано / отменено, вы можете вернуть выбранный индекс к индексу ранее выбранного элемента.

0 голосов
/ 30 июня 2011

Как насчет того, чтобы сделать редактируемый элемент копией элемента вместо фактического элемента?

Так что ваша ViewModel будет содержать

ObservableCollection<MyModel> ComboBoxItems;
int SelectedComboBoxIndex;
MyModel EditingItem;

Всякий раз, когда событие PropertyChange происходит на SelectedComboBoxIndex, вы проверяете и видите, является ли EditingItem нулевым или нет. Если это null, это означает, что вы можете безопасно переключаться, и вы установили

EditingItem = ComboBoxItem[SelectedComboBoxIndex]).Copy();

Если EditingItem не равно нулю, вы выдает запрос, спрашивающий, хочет ли пользователь сохранить изменения или отменить.

Когда пользователь нажимает кнопку Сохранить, он принимает EditingItem и применяет изменения к хранилищу данных и обновляет элемент в списке ComboBoxItems.

Если они нажимают кнопку Отмена, EditingItem просто отбрасывается.

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