Когда пользователь говорит «нет», WPF не знает, что значение изменилось. Что касается WPF, то это значение выбирается пользователем.
Вы можете попытаться поднять уведомление об изменении свойства:
public object SelItem
{
get { ... }
set
{
if (!CancelChange())
{
this.selItem = value;
}
OnPropertyChanged("SelItem");
}
}
Проблема в том, что уведомление об изменении происходит в том же контексте события выбора. Таким образом, WPF игнорирует его, потому что он уже знает, что свойство изменилось - на элемент, выбранный пользователем!
Вам нужно вызвать событие уведомления в отдельном сообщении:
public object SelItem
{
get { ... }
set
{
if (CancelChange())
{
Dispatcher.BeginInvoke((ThreadStart)delegate
{
OnPropertyChanged("SelItem");
});
return;
}
this.selItem = value;
OnPropertyChanged("SelItem");
}
}
WPF затем обработает это сообщение после того, как завершит обработку измененного события выбора и поэтому вернет значение в представлении обратно к тому, каким оно должно быть.
Ваша виртуальная машина, очевидно, нуждается в доступе к текущему Dispatcher
. См. мое сообщение в блоге о базовом классе виртуальных машин, если вам нужны некоторые указания о том, как это сделать.