Ну, вам, вероятно, не понравится ответ ... WPF TreeView
- недружелюбный парень. Хорошо, первые вещи первые ...
захватывая попытку изменить выбранный элемент:
Самый простой способ сделать это, чтобы справиться с SelectedItemChanged
событие:
private void TreeView_SelectedItemChanged(object sender,
RoutedPropertyChangedEventArgs<object> e)
{
e.Handled = true;
}
К сожалению, если вы используете MVVM, вам необходимо обработать его внутри Attached Property
. Теперь немного усложнись, если вы собираетесь создать Attached Property
для обработки события SelectedItemChanged
, тогда вы можете также реализовать SelectedItem
Attached Property
, с которым вы могли бы связываться в Two-Way Mode
. Я не буду документировать, как это сделать, потому что для этого есть много онлайн-руководств.
... и, возможно, отменить его:
Если у вас есть SelectedItem
Attached Property
, то вы можете контролировать, когда, что изменения свойств. Конечно, есть уловка ... к моменту внесения изменений в вашу модель представления пользовательский интерфейс уже изменился. Таким образом, хотя вы можете остановить изменение, происходящее с данными в модели представления, вы не можете остановить выбор, сделанный в пользовательском интерфейсе.
Это не страшная проблема, хотя, потому что с Two-Way Binding
, вы сможете установить выбор интерфейса вернуться к предыдущему пункту, если это необходимо ... посмотрите на этот псевдо-код:
public YourDataType SelectedItem
{
get { return selectedItem; }
set
{
if (selectedItem != value)
{
if (selectedItem.HasChanges)
{
if (WindowManager.UserAcceptsLoss())
{
selectedItem = value;
NotifyPropertyChanged("SelectedItem");
}
else ResetSelectedItem(selectedItem);
}
else
{
selectedItem = value;
NotifyPropertyChanged("SelectedItem");
}
}
}
}
Для выполнения ваших требований у вас впереди много работы ... удачи в этом.
Есть ли возможность достичь этого, обратившись к PreviewMouseDown (e.Handled = true). – Ravuthasamy