引言
- TreeView控件是WPF(Windows Presentation Foundation)中用于
显示分层
数据的常用控件。这个控件允许用户以树形结构
展示数据,使得数据更加清晰易懂。在创建文件浏览器、组织结构图等应用程序时,TreeView控件非常有用。
TreeView控件常用属性
1.Items属性
- tems属性是用来获取或设置TreeView中的
项的集合
。你可以通过这个属性动态添加或删除
节点。例如,你可以创建一个新的TreeViewItem对象,设置它的相关属性,然后将其添加到TreeView的Items集合中。
2.ItemsSource属性
- ItemsSource属性是绑定到TreeView中
数据的源
。通过将数据源
绑定到这个属性,可以实现数据的自动加载和更新
。你可以将任何实现了IEnumerable接口的对象绑定到这个属性,例如List、Array、ViewModel等。
3.SelectedItem属性
- SelectedItem属性是用来获取或设置当前
被选中
的项的。你可以通过这个属性监听节点选中
事件。当用户选择一个节点时,SelectedItem属性将被设置为对应的TreeViewItem对象。
4.Header属性
- Header属性是用来获取或设置TreeView项的
头部内容
。你可以通过这个属性自定义节点
的显示内容。你可以设置Header属性的值为一个字符串、一个控件或者一个布局。
5.Tag属性
- Tag属性用于存储与TreeView项相关的
附加信息
。你可以在代码中访问和操作
这些信息。例如,你可以将一个对象或者一个数据值设置为某个TreeViewItem的Tag,然后在需要的时候通过这个Tag获取数据。
6.ContextMenu属性
-
ContextMenu属性是用来获取或设置与TreeView项
关联的上下文菜单
的。你可以自定义右键菜单
的内容和行为。例如,你可以创建一个ContextMenu,然后将其设置为TreeViewItem的ContextMenu属性。 -
下面来写个例子,右键菜单执行操作,这里用到命令,首先需要安
CommunityToolkit.Mvvm
:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--添加TextBlock用来提示相关操作-->
<TextBlock x:Name="myTextBlock" Grid.Row="0" FontSize="16" Foreground="Red" Margin="10" Text="{Binding TextBlockMsg}"></TextBlock>
<TreeView Grid.Row="1" x:Name="myTreeView" ItemsSource="{Binding TreeNodes}" Margin="10">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView.ContextMenu>
<ContextMenu>
<!--这里绑定选择数据时,要用SelectedItem取值-->
<MenuItem Header="编辑" Command="{Binding EditCommand}" CommandParameter="{Binding PlacementTarget.SelectedItem, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
<MenuItem Header="删除" Command="{Binding DeleteCommand}" CommandParameter="{Binding PlacementTarget.SelectedItem, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
</ContextMenu>
</TreeView.ContextMenu>
</TreeView>
</Grid>
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Input;
namespace WpfCommonControls
{
/// <summary>
/// TreeViewWindow.xaml 的交互逻辑
/// </summary>
public partial class TreeViewWindow : Window
{
public TreeViewWindow()
{
InitializeComponent();
// 绑定上下文
DataContext = new TreeViewModel();
}
}
/// <summary>
/// 树节点实体类
/// </summary>
public class TreeNodeModel
{
public string Name { get; set; }=string.Empty;
public ObservableCollection<TreeNodeModel> Children { get; set; } = new ObservableCollection<TreeNodeModel>();
}
/// <summary>
/// 树ViewModel
/// </summary>
public class TreeViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
private string _textBlockMsg = "这里显示相关提示操作";
public string TextBlockMsg {
get => _textBlockMsg;
set
{
_textBlockMsg = value;
OnPropertyChanged(nameof(TextBlockMsg));
}
}
private ObservableCollection<TreeNodeModel> _treeNodes=new ObservableCollection<TreeNodeModel> ();
public ObservableCollection<TreeNodeModel> TreeNodes
{
get => _treeNodes;
set
{
_treeNodes = value;
OnPropertyChanged(nameof(TreeNodes));
}
}
public ICommand EditCommand { get; set; }
public ICommand DeleteCommand { get; set; }
public TreeViewModel()
{
// 初始化数据源
TreeNodes = new ObservableCollection<TreeNodeModel>
{
new TreeNodeModel { Name = "根节点",
Children = new ObservableCollection<TreeNodeModel>
{
new TreeNodeModel { Name = "子节点1",Children=new ObservableCollection<TreeNodeModel>
{
new TreeNodeModel { Name = "子节点1-1" },
new TreeNodeModel { Name = "子节点1-2" }
}
},
new TreeNodeModel { Name = "子节点2" }
}
}
};
EditCommand = new RelayCommand<TreeNodeModel>(OnEditNode);
DeleteCommand = new RelayCommand<TreeNodeModel>(OnDeleteNode);
}
private void OnEditNode(TreeNodeModel? node)
{
// 编辑节点的逻辑
TextBlockMsg = $"编辑节点: {node?.Name}";
}
private void OnDeleteNode(TreeNodeModel? node)
{
// 删除节点的逻辑
TextBlockMsg = $"删除节点: {node?.Name}";
}
}
}
上述代码,动态绑定TreeView数据源,以及ContextMenu菜单属性,相关操作取值,运行效果如下图:
公众号“点滴分享技术猿”