Почему именно он не реализует свойство, я не знаю, но у меня есть предложение внизу.
Ваш код выше будет работать, однако это не то, что делает свойство IsSynchronizedWithCurrentItem. Любой ItemsControl привязывается к ICollectionView свойства ItemsSource. Чтобы получить этот ICollectionView, мы можем вызвать CollectionViewSource.GetDefaultCollectionView (объект o). В зависимости от типа объекта o, вы получаете различную конкретную реализацию интерфейса ICollectionView. CollectionView и ListCollectionView - это два конкретных класса, которые приходят на ум.
Интерфейс ICollectionView содержит член с именем CurrentItem. Что делает IsSynchronizedWithCurrentItem: при каждом нажатии элемента на ItemsControl он устанавливает CurrentItem для представления коллекции. ICollectionView также имеет два события: CurrentItemChanging и CurrentItemChanged. Когда свойство IsSynchronizedWithCurrentItem установлено, ItemsControl обновит SelectedItem на основе того, что представляет собой CurrentItem объекта ICollectionView. Имеет смысл?
В сценариях master / detail WPF мы просто привязываемся к ICollectionViews и их CurrentItem (синтаксис CurrentItem - это что-то вроде {Binding Items / Name}, где Name - это свойство Name в CurrentItem коллекции.
Так что, хотя ваш код работает для ваших целей, он не делает то, что делает это свойство. Чтобы сделать то, что делает свойство, вам нужно сделать следующее:
- Когда элемент выбран, вам нужно выяснить, к какой коллекции он принадлежит. как нам это сделать? Я считаю, что именно поэтому TreeView не реализует это. Выбранный элемент отображается в TreeViewItem. DataContext - это сам объект, но что такое родительская коллекция? Я думаю, чтобы получить его, вы можете либо кэшировать его в некотором хэш-файле (глупо, но будет работать), либо вы можете пройти по логическому дереву и получить родительский элемент TreeViewItem, который оказывается ItemControl. Свойство ItemsSource будет вашей коллекцией.
- Получите ICollectionView для этой коллекции.
- Необходимо преобразовать этот ICollectionView в CollectionView (ICollectionView не реализует установщик CurrentItem)
- Вызовите SetCurrent (.., ..) для экземпляра CollectionView
Теперь все, что связано с текущим элементом ICollectionView, будет обновлено.
Это стало длиннее, чем я ожидал. Дайте мне знать, если необходимы дальнейшие разъяснения.