Я пытаюсь связать свойство IsExpanded TreeViewItem с моей ViewModel. Я хочу иметь возможность установить для свойства значение true и заставить TreeViewItem расширяться. Увы, похоже, это не работает. Ничего не происходит, когда я нажимаю кнопку «Развернуть все».
Я попытался связать его таким образом, используя режим TwoWay, а также пытаясь использовать DataTrigger. Я не совсем уверен, в чем проблема. Выходные данные отладчика показывают, что у меня нет сбоев привязки XAML во время выполнения.
Код позади:
namespace TreeViewProblem
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainWindowViewModel();
}
private void TreeViewItem_Expanded(object sender, RoutedEventArgs e)
{
//MessageBox.Show("");
//e.Handled = true;
//TreeViewItem item = e.Source as TreeViewItem;
//item.IsExpanded = false;
}
}
}
XAML:
<Window x:Class = "TreeViewProblem.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local = "clr-namespace:TreeViewProblem"
xmlns:i = "http://schemas.microsoft.com/xaml/behaviors"
mc:Ignorable = "d"
Title = "MainWindow" Height = "450" Width = "800">
<Grid>
<TreeView Grid.Row = "1" Grid.Column = "0" Name = "RegistryTreeView" ItemsSource = "{Binding Keys}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource = "{Binding SubKeys}">
<TreeViewItem Header = "{Binding name}" IsExpanded = "{Binding IsExpanded, Mode=TwoWay}">
</TreeViewItem>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
<Button Margin = "547,193,67,193" Command = "{Binding ButtonCommand}" Content = "Expand All">
</Button>
</Grid>
</Window>
KeyViewModel:
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;
namespace TreeViewProblem.ViewModels
{
public class KeyViewModel : INotifyPropertyChanged
{
public ObservableCollection<KeyViewModel> SubKeys { get; } = new();
public string name { get; }
private bool _IsExpanded;
public event PropertyChangedEventHandler? PropertyChanged;
public bool IsExpanded
{
get { return _IsExpanded; }
set
{
_IsExpanded = value;
this.NotifyPropertyChanged(nameof(IsExpanded));
}
}
public KeyViewModel(string keyName)
{
name = keyName;
if (!name.Contains("test"))
SubKeys.Add(new KeyViewModel("test"));
else if (name == "test")
SubKeys.Add(new KeyViewModel("test2"));
}
public void NotifyPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Модель MainWindowViewModel:
namespace TreeViewProblem
{
public class MainWindowViewModel : ObservableObject
{
public ObservableCollection<KeyViewModel> Keys { get; set; } = new();
public MainWindowViewModel()
{
Keys.Add(new KeyViewModel("Item1"));
Keys.Add(new KeyViewModel("Item2"));
Keys.Add(new KeyViewModel("Item3"));
Keys.Add(new KeyViewModel("Item4"));
Keys.Add(new KeyViewModel("Item5"));
}
public ICommand ButtonCommand
=> new RelayCommand(Expand);
void Expand()
{
foreach(var key in Keys)
{
key.IsExpanded = true;
}
}
}
}





Проблема в том, что вы помещаете TreeViewItem внутрь HierarchicalDataTemplate. Замените его, например. TextBlock и свяжите IsExpanded в стиле.
<TreeView ItemsSource = "{Binding Keys}">
<TreeView.Resources>
<Style TargetType = "TreeViewItem">
<Setter Property = "IsExpanded" Value = "{Binding IsExpanded}"/>
</Style>
</TreeView.Resources>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource = "{Binding SubKeys}">
<TextBlock Text = "{Binding name}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Я смог заставить это работать таким образом
<TreeView Grid.Row = "1" Grid.Column = "0" Name = "RegistryTreeView" ItemsSource = "{Binding Keys}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource = "{Binding SubKeys}">
<TreeViewItem Header = "{Binding name}">
</TreeViewItem>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView.ItemContainerStyle>
<Style TargetType = "{x:Type TreeViewItem}">
<Setter Property = "IsExpanded" Value = "{Binding IsExpanded, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
Как мой ответ, который я разместил, сравнивается с вашим? Как бы вы сказали, что это лучший способ?