C# 如何在WPF中在TreeView上直观地显示multiselect
我正在尝试启用C# 如何在WPF中在TreeView上直观地显示multiselect,c#,wpf,xaml,treeview,C#,Wpf,Xaml,Treeview,我正在尝试启用TreeView控件以支持多选 非常基本的流程是有效的,如果您在按住ctrl或shift键的同时在树视图中选择多个项目,那么它将成功地将这些项目添加到视图模型中的列表中 问题是,当实际单击树视图项目时,它只会在视觉上选择一个项目,即只有一个项目被标记为选中。如何突出显示/标记多个项目?我不明白这是在哪里控制的 TreeViewxaml: <TreeView x:Name="availableColumnsTreeView" AutomationP
TreeView
控件以支持多选
非常基本的流程是有效的,如果您在按住ctrl或shift键的同时在树视图中选择多个项目,那么它将成功地将这些项目添加到视图模型中的列表中
问题是,当实际单击树视图
项目时,它只会在视觉上选择一个项目,即只有一个项目被标记为选中。如何突出显示/标记多个项目?我不明白这是在哪里控制的
TreeView
xaml:
<TreeView x:Name="availableColumnsTreeView"
AutomationProperties.AutomationId="availableColumnsTreeView"
x:Uid="availableColumnsTreeView"
SelectedItemChanged="availableColumnsTreeView_SelectedItemChanged"
ItemsSource="{Binding Path=TreeFieldData, Mode=OneWay, Converter={StaticResource SortingConverter}, ConverterParameter='DisplayName.Text'}"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto"
Grid.Row="0">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate x:Uid="HierarchicalDataTemplate_1" ItemsSource="{Binding Path=Children, Mode=OneWay, Converter={StaticResource SortingConverter}, ConverterParameter='DisplayName.Text'}">
<TextBlock x:Uid="TextBlock_1" Text="{Binding DisplayName.Text, Mode=OneWay}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
所以“availableColumnsTreeView_SelectedItemChanged”调用得很好,但我需要它来实际突出显示所选项目
编辑:请先阅读我的问题,然后再将其标记为副本。我尽量明确我的问题是什么。我不是在寻找隐藏在某个驱动器文档中的multi-select的完整解决方案
如何突出显示/标记多个项目?我不明白这是在哪里控制的
使用treevieItem
样式定义treevieItem
容器的外观。如果向数据对象添加“IsSelected”属性以跟踪当前是否选中该项,则可以使用绑定到此属性并提供突出显示的DataTrigger
,例如:
<TreeView>
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="True">
<Setter Property="Background" Value="Yellow" />
</DataTrigger>
</Style.Triggers>
</Style>
</TreeView.Resources>
...
</TreeView>
...
确保定义“IsSelected”属性的数据类实现了INotifyPropertyChanged
接口,并且您在事件处理程序或命令中设置了此属性
我不确定我是否100%的理解你。请举个小例子好吗
当然
这里是xaml:
<TreeView ItemsSource="{Binding Items}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Children, Mode=OneWay}">
<CheckBox Content="{Binding Text, Mode=OneWay}" IsChecked="{Binding IsSelected}">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="True">
<DataTrigger.Setters>
<Setter Property="Foreground" Value="Red" />
</DataTrigger.Setters>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
这里是cs:
public class Item : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public string Text { get; set; }
public List<Item> Children { get; set; }
bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set
{
_isSelected = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsSelected)));
}
}
public Item(string text)
{
Text = text;
}
}
public partial class MainWindow : Window
{
public List<Item> Items { get; set; } = new List<Item>
{
new Item("1") { Children = new List<Item>
{
new Item("11"),
new Item("12"),
new Item("13"),
}},
new Item("2") { Children = new List<Item>
{
new Item("11"),
new Item("12"),
new Item("13"),
}},
new Item("3"),
};
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
}
公共类项:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
公共字符串文本{get;set;}
公共列表子项{get;set;}
布尔乌当选;
公选学校
{
获取{return}isSelected;}
设置
{
_isSelected=值;
PropertyChanged?.Invoke(这是新的propertychangedventargs(nameof(IsSelected));
}
}
公共项目(字符串文本)
{
文本=文本;
}
}
公共部分类主窗口:窗口
{
公共列表项{get;set;}=新列表
{
新项目(“1”){Children=新列表
{
新项目(“11”),
新项目(“12”),
新项目(“13”),
}},
新项目(“2”){Children=新列表
{
新项目(“11”),
新项目(“12”),
新项目(“13”),
}},
新项目(“3”),
};
公共主窗口()
{
初始化组件();
DataContext=this;
}
}
我正在使用复选框
选择项目(不知道您是如何操作的)。如果选中该项,则通过数据触发器将其前景更改为红色
正如您所看到的,选择(不管您如何实现它,实际上,我使用的是单一选择TreeView
)存储在项目中,作为IsSelected
值。您可以遍历分层集合以获得所选项目的列表(这称为奉承)
注意:IPropertyChanged
,如果您计划从代码隐藏中设置IsSelected
(例如,按下按钮选择所有项目),则此选项是必需的
这应该很容易适应你的情况。可能是@Fruchtzwerg的重复。我看了一下,然后用另一种方式做了。但现在我遇到了我的问题“将这些项目添加到列表”中描述的问题,您可以使用项目本身的额外属性来存储选择并简单地将其同步(将项目添加/删除到此选择列表的位置),而不是使用额外的列表。作为奖励,您可以在数据模板中使用该属性来执行某些操作(运行触发器、更改背景等)。@Sinatr我不确定是否100%跟随您。请举个小例子好吗?