Powershell + WPF - TreeListView 分层复选框

问题描述 投票:0回答:1

我有一个问题。我需要创建带有复选框的动态创建的 TreeListView 。我已经有了,但我需要做的是,当选择父节点时,自动选择所有子节点。我怎样才能做到这一点?这是我已经创建的代码

[xml]$xaml = @"
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="My TreeView" Height="300" Width="300">
    <Grid>
        <TreeView Name="MyTreeView" Margin="10">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                    <StackPanel Orientation="Horizontal">
                        <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" VerticalAlignment="Center"/>
                        <TextBlock Text="{Binding Name}" Margin="5,0,0,0"/>
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>
</Window>
"@

$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$window=[Windows.Markup.XamlReader]::Load( $reader )

# Define the data structure for the treeview
class Node {
    [string]$Name
    [System.Collections.ObjectModel.ObservableCollection[Node]]$Children
    [bool]$IsChecked
}

# Populate treeview with sample data
$root = New-Object Node
$root.Name = "Root"
$root.Children = New-Object System.Collections.ObjectModel.ObservableCollection[Node]

$child1 = New-Object Node
$child1.Name = "Child 1"
$child1.Children = New-Object System.Collections.ObjectModel.ObservableCollection[Node]

$child2 = New-Object Node
$child2.Name = "Child 2"
$child2.Children = New-Object System.Collections.ObjectModel.ObservableCollection[Node]

$root.Children.Add($child1)
$root.Children.Add($child2)

$treeview = $window.FindName("MyTreeView")

$treeview.ItemsSource = @($root)

$window.ShowDialog() | Out-Null

wpf powershell winforms data-binding
1个回答
0
投票

我该怎么做?

IsChecked
属性的setter中添加一些逻辑,设置
Children
集合中所有项目的相应属性,并实现
INotifyPropertyChanged
接口来通知视图:

Add-Type -TypeDefinition @"
    using System.ComponentModel;
    using System.Collections.ObjectModel;

    public class Node : INotifyPropertyChanged  {
        public string Name { get; set; }
        public ObservableCollection<Node> Children { get; set; }

        private bool isChecked;
        public bool IsChecked {
            get { return isChecked; }
            set {
                isChecked = value;
                OnPropertyChanged("IsChecked");
                foreach (var node in Children)
                  node.IsChecked = true;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName) {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
"@
© www.soinside.com 2019 - 2024. All rights reserved.