Почему именно это свойство не реализуется, я не знаю, но у меня есть предложение ниже.
Ваш код выше будет работать, однако это не то, что делает свойство IsSynchronizedWithCurrentItem. Любой ItemsControl привязывается к ICollectionView свойства ItemsSource. Чтобы получить этот ICollectionView, мы можем вызвать CollectionViewSource.GetDefaultCollectionView(object 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, который оказывается ItemsControl. Свойство ItemsSource будет вашей коллекцией.
- Получите ICollectionView для этой коллекции.
- Необходимо преобразовать этот ICollectionView в CollectionView (ICollectionView не реализует установщик CurrentItem)
- Вызов SetCurrent(.., ..) в экземпляре CollectionView
Теперь все, что связано с CurrentItem этого ICollectionView, будет обновлено.
Это стало дольше, чем я ожидал. Дайте мне знать, если необходимы какие-либо дополнительные разъяснения.
person
Szymon Rozga
schedule
17.12.2008