C#使用TreeView实现树形菜单并增加选择框选中一级节点时将所有二级节点都选中取消一级节点选中时将二级节点都取消包含xaml和xamlcs的完整代码
以下是一个使用TreeView实现树形菜单,并增加选择框的C#代码示例,包括xaml和xaml.cs的完整代码:
XAML代码(MainWindow.xaml):
<Window x:Class="TreeViewExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TreeView Example" Width="300" Height="300">
<Grid>
<TreeView x:Name="treeView" ItemsSource="{Binding}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}" Click="CheckBox_Click"/>
<TextBlock Text="{Binding Name}" Margin="5,0"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
</Window>
C#代码(MainWindow.xaml.cs):
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
namespace TreeViewExample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// 创建根节点
var rootNode = new TreeNode { Name = "Root" };
// 创建一级节点
var node1 = new TreeNode { Name = "Node 1" };
var node2 = new TreeNode { Name = "Node 2" };
// 创建二级节点
var subNode1 = new TreeNode { Name = "SubNode 1" };
var subNode2 = new TreeNode { Name = "SubNode 2" };
// 将二级节点添加到一级节点
node1.Children.Add(subNode1);
node2.Children.Add(subNode2);
// 将一级节点添加到根节点
rootNode.Children.Add(node1);
rootNode.Children.Add(node2);
// 设置数据上下文为根节点
DataContext = new ObservableCollection<TreeNode> { rootNode };
}
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
// 获取点击的复选框
var checkBox = (CheckBox)sender;
// 获取复选框的DataContext(即节点对象)
var node = (TreeNode)checkBox.DataContext;
// 更新节点的选中状态
UpdateChildrenNodeCheckState(node, checkBox.IsChecked == true);
UpdateParentNodeCheckState(node.Parent, checkBox.IsChecked == true);
}
private void UpdateChildrenNodeCheckState(TreeNode node, bool isChecked)
{
// 递归更新子节点的选中状态
foreach (var child in node.Children)
{
child.IsChecked = isChecked;
UpdateChildrenNodeCheckState(child, isChecked);
}
}
private void UpdateParentNodeCheckState(TreeNode node, bool isChecked)
{
// 更新父节点的选中状态
if (node != null)
{
bool allChildrenChecked = true;
bool allChildrenUnchecked = true;
foreach (var child in node.Children)
{
if (child.IsChecked)
{
allChildrenUnchecked = false;
}
else
{
allChildrenChecked = false;
}
}
if (isChecked)
{
node.IsChecked = allChildrenChecked;
}
else
{
node.IsChecked = !allChildrenUnchecked;
}
// 递归更新父节点的选中状态
UpdateParentNodeCheckState(node.Parent, isChecked);
}
}
}
public class TreeNode : INotifyPropertyChanged
{
private bool isChecked;
public bool IsChecked
{
get { return isChecked; }
set
{
isChecked = value;
OnPropertyChanged("IsChecked");
}
}
public string Name { get; set; }
public ObservableCollection<TreeNode> Children { get; set; } = new ObservableCollection<TreeNode>();
public TreeNode Parent { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
这个示例中,我们通过创建TreeNode类来表示树节点。每个节点都有一个IsChecked属性来表示是否选中,一个Name属性来表示节点名称,以及一个Children属性来保存子节点集合。在MainWindow构造函数中,我们创建了一个根节点和一些一级节点和二级节点,并将它们添加到相应的父节点中。然后,我们将根节点设置为TreeView的数据上下文,这样TreeView就可以根据数据源自动生成树形菜单。
我们还定义了一个CheckBox_Click事件处理程序来处理复选框的点击事件。在这个事件处理程序中,我们根据复选框的选中状态递归更新子节点的选中状态,并递归更新父节点的选中状态。
通过运行这个示例,你将看到一个带有树形菜单和复选框的窗口。当你选择一个一级节点时,所有的二级节点都会被选中。当你取消选择一个一级节点时,所有的二级节点都会被取消选中
原文地址: http://www.cveoy.top/t/topic/ii20 著作权归作者所有。请勿转载和采集!