IsExpanded只适用于第一层的TreeView

本文关键字:一层 TreeView 适用于 IsExpanded | 更新日期: 2023-09-27 18:18:18

我使用的是一个带有HierarchicalDataTemplate的TreeView,但不能让IsExpanded属性工作在比第一个更高的级别。这是我的xaml:

<TreeView>
     <TreeView.ItemTemplate>
         <HierarchicalDataTemplate ItemsSource="{Binding Children}">
             <TextBlock Text="{Binding Text}" />
         </HierarchicalDataTemplate>
     </TreeView.ItemTemplate>
</TreeView>

在我的资源词典中我有:

<Style TargetType="TreeViewItem">
    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
</Style>

是什么使得一阶有效

在更高的缩进级别中,IsExpanded总是为false,因为PropertyChangedEventHandler不会为子对象触发。

这是我的类:

public class ListItem : INotifyPropertyChanged
{
    private bool isExpanded;
    public bool IsExpanded
    {
        get { return isExpanded; }
        set
        {
            if (isExpanded != value)
            {
                isExpanded = value;
                SendPropertyChanged("IsExpanded");
            }
        }
    }
    private void SendPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public ObservableCollection<ListItem> Children { get; set; }
    ...
}

编辑:我很抱歉,我更正的代码正在工作!

IsExpanded只适用于第一层的TreeView

如果你想自动展开所有的子元素以及目标项目那么你需要自己向下传播更改,像这样做....

public bool IsExpanded 
{ 
    get { return isExpanded; } 
    set 
    { 
        if (isExpanded != value) 
        { 
            isExpanded = value; 
            if (isExpanded)
            {
                foreach(ListItem child in Children)
                    child.IsExpanded = true;
            }
            SendPropertyChanged("IsExpanded"); 
        } 
    } 
}