Допущения:
- Вы отображаете диалоговое окно (с сообщением и кнопками OKCancel), когда пользователь выбирает какое-либо значение из ComboBox.
- Если пользователь нажимает OK, все в порядке.:)
- Если пользователь нажимает Отмена, вы говорите vmPropSelectedValue = previousValue.
Это не сработает.Зачем?
Точного ответа нет, но я полагаю, что когда вы показываете диалоговое окно, система только что изменила выбранное значение, а только что уведомил источник (через инфраструктуру привязки) об измененном значении.Если в этот момент (когда источник имеет контроль), вы теперь измените значение свойства ViewModel из своего кода виртуальной машины, что, как вы ожидаете, вызовет OnPropertyChanged из INotifyPropertyChanged, который, как вы ожидаете, попросит WPF обновить цель с вашим запрошенным значением.Однако WPF еще не завершил цикл - он все еще ждет, пока Источник вернет ему элемент управления.Поэтому он просто отклоняет ваш запрос (в противном случае он будет идти в бесконечном цикле).
Если это сбивает с толку, попробуйте следующее:
Цикл начинается:
1. Пользователь изменяет значение в пользовательском интерфейсе.WPF меняет цель.
2. привязка инфраструктуры запрашивает источник об обновлении самого себя.
3. Источник обновляет себя (свойство VM).
4. Источник возвращает управление обратно связыванию ниже.
Завершение цикла.
Эксперты: Не удалось найти какую-либо документацию по этому вопросу.Выше моя вера, как все работает.Пожалуйста, исправьте, если неверно.
Краткий ответ:
AFAIK, это невозможно сделать только с помощью чистого кода виртуальной машины.Вам нужно будет добавить код с выделенным кодом.
Вот один из способов: http://www.amazedsaint.com/2008/06/wpf-combo-box-cancelling-selection.html