Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF中在TreeView上直观地显示multiselect_C#_Wpf_Xaml_Treeview - Fatal编程技术网

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%跟随您。请举个小例子好吗?