Привязка TreeViewItem IsExpanded не работает

Я пытаюсь связать свойство 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;
            }
        }
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
90
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема в том, что вы помещаете 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>

Как мой ответ, который я разместил, сравнивается с вашим? Как бы вы сказали, что это лучший способ?

Meme Machine 06.04.2023 06:05

Я смог заставить это работать таким образом

<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>

Другие вопросы по теме