我尝试启用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;被调用很好,但我需要它来实际突出显示所选项目。
编辑:请在将其标记为重复之前阅读我的问题。我试图尽可能具体地解决我的问题。我没有在一个驱动文档中寻找隐藏多选的完整解决方案。
答案 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
,则需要这样做(例如,按下按钮时选择所有项目)。
应该很容易适应你的情况。