У меня есть типичный проводник Windows / файлов, например setup.
ListView имеет свойство IsSynchronizedWithCurrentItem, которое отлично работает. например Если бы у меня был другой ListView, показывающий список узлов, и у обоих listView для этого свойства было установлено значение true. Изменение выбора узла в NodesListView автоматически обновит PropertiesListView.
Теперь мне нужно то же самое с NodesTreeView и PropertiesListView ... и похоже, что TreeView не имеет такого свойства.
Есть ли решение этой проблемы более подходящим для WPF? Или мне нужно обработать событие NodeSelectionChanged дерева и обновить listView с помощью кода.





Мое решение оказалось довольно крошечным ... не знаю, эквивалентно ли оно IsSynchronizedWithCurrentItem. ListView обновляется должным образом.
// the XAML
<TreeView DockPanel.Dock = "Left" x:Name = "tvwNodes" ItemsSource = "{Binding}" SelectedItemChanged = "OnNewNodeSelected"/>
<ListView x:Name = "lvwProperties" ItemsSource = "{Binding Path=Properties}"
// the code-behind
private void OnNewNodeSelected(object sender, RoutedPropertyChangedEventArgs<object> e)
{
lvwProperties.DataContext = tvwNodes.SelectedItem; // this returns the selected Node obj
}
Почему именно он не реализует свойство, я не знаю, но у меня есть предложение ниже.
Ваш код выше будет работать, однако это не то, что делает свойство 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. Имеет смысл?
В основных / подробных сценариях WPF мы просто привязываемся к ICollectionViews и их CurrentItem (синтаксис CurrentItem похож на {Binding Items / Name}, где Name - это свойство Name в CurrentItem коллекции.
Итак, хотя ваш код работает для ваших целей, он не делает того, что делает это свойство. Чтобы сделать то, что делает свойство, вам необходимо сделать следующее:
Теперь все, что связано с CurrentItem ICollectionView, будет обновлено.
Это оказалось дольше, чем я ожидал. Сообщите мне, если необходимы дальнейшие разъяснения.
Очень простое решение - привязать элементы пользовательского интерфейса «детали» к свойству SelectedValue TreeView. Например, если ваше TreeView выглядело так:
<TreeView Name = "CategoryName" ItemsSource = "{Binding Source = {StaticResource A_Collection}, Path=RootItems}" />
Затем вы можете связать элементы пользовательского интерфейса деталей (например, текстовое поле), используя:
<TextBox Text = "{Binding ElementName=CategoryTreeView, Path=SelectedValue.Name}"/>
Это приведет к привязке текстового поля к свойству Name элементов, выбранных в данный момент в TreeView.
Если вы хотите связать многие элементы пользовательского интерфейса как детали для выбранного элемента TreeView, рассмотрите возможность настройки DataContext для элемента, который содержит все элементы управления деталями (DockPanel / Grid / StackPanel и т. д.).
<ListView Name = "listView1"
ItemsSource = "{Binding Path=SelectedItem.Modules,
ElementName=treeView1, Mode=OneWay}"
IsSynchronizedWithCurrentItem = "True">
Где «.Modules» - это набор дочерних элементов из выбранного элемента древовидного представления, который вы хотите отобразить. Не беспокойтесь о подключении события «SelectedItemChanged» в древовидной структуре.
Определенно решение, работает с шармом! К вашему сведению: привязать это через графический интерфейс Blend невозможно.