如何在WPF

时间:2017-03-06 13:31:49

标签: c# wpf xaml treeview

我尝试启用TreeView控件以支持多选。

非常基本的流程有效,如果您在按住ctrl或shift的同时在TreeView中选择多个项目,那么它会将这些项目成功添加到我在视图模型中的列表中。

问题在于,当实际点击TreeView项目时,它只会在视觉上选择一个,即只有一个项目被标记为已选择。如何让它突出显示/标记多个项目?我不明白这是在哪里受到控制。

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>

所以&#34; availableColumnsTreeView_SelectedItemChanged&#34;被调用很好,但我需要它来实际突出显示所选项目。

编辑:请在将其标记为重复之前阅读我的问题。我试图尽可能具体地解决我的问题。我没有在一个驱动文档中寻找隐藏多选的完整解决方案。

2 个答案:

答案 0 :(得分:1)

  

如何突出显示/标记多个项目?我不明白这是在哪里受到控制。

使用TreeViewItem样式定义TreeViewItem容器的外观。如果你添加一个&#34; IsSelected&#34;数据对象的属性,用于跟踪当前是否选择了该项目,您可以使用绑定到此项目的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>

确保&#34; IsSelected&#34;的数据类。 property已定义实现INotifyPropertyChanged接口,并在事件处理程序或命令中设置此属性。

答案 1 :(得分:1)

  

我不确定我是否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;
    }
}

我正在使用CheckBox来选择项目(不知道你是怎么做的)。如果选择了项目,则通过数据触发将其前景更改为红色。

正如您所看到的选择(忽略您如何实现它,实际上,我使用单一选择TreeView)作为IsSelected值存储在项目中。您可以遍历分层集合以获取所选项目的列表(这称为 flattering )。

注意:IPropertyChanged,如果您打算从代码隐藏中设置IsSelected,则需要这样做(例如,按下按钮时选择所有项目)。

应该很容易适应你的情况。