如何在TreeView用户控件中定义TreeViewItem触发器



我已经创建了允许多选的TreeView用户控件。为了直观地显示所选项目,我在Style中使用触发器来表示TreeViewItem。此样式在用户控制资源中定义如下:

<TreeView x:Class="SchoolsExample.MultiSelectionTreeView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
mc:Ignorable="d" 
xmlns:local="clr-namespace:SchoolsExample"
d:DesignHeight="300" d:DesignWidth="300" SelectedItemChanged="TreeView_SelectedItemChanged">
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="TreeViewItem_MouseLeftButtonDown"/>
<EventSetter Event="MouseLeftButtonUp" Handler="TreeViewItem_MouseLeftButtonUp"/>
<Style.Triggers>
<Trigger Property="local:MultiSelectionTreeViewItemBehaviour.IsMultiSelected" Value="True">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
</Trigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=(local:MultiSelectionTreeViewItemBehaviour.IsMultiSelected), RelativeSource={RelativeSource Self}}" Value="True"/>
<Condition Binding="{Binding IsSelectionActive, RelativeSource={RelativeSource Self}}" Value="False"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/>
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</TreeView.Resources>
</TreeView>

但当我想使用这个控件时,我想把我的TreeViewItem设置成这样:

<local:MultiSelectionTreeView x:Name="MultiSelectionTreeView" ItemsSource="{Binding Schools}">
<local:MultiSelectionTreeView.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="local:MultiSelectionTreeViewItemBehaviour.IsMultiSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
</Style>
</local:MultiSelectionTreeView.Resources>
<local:MultiSelectionTreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Pupils}">
<TextBlock Text="{Binding Name}"/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding FullName}"/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</local:MultiSelectionTreeView.ItemTemplate>
</local:MultiSelectionTreeView>

然后我得到一个异常,说我不能设置Resource两次。即使我设法以某种方式设置了TreeViewItem的样式,那么我想要的TreeViewItem的视觉行为也会被覆盖。

我想知道的是,是否有某种方法可以为我在TreeView用户控件中使用的TreeViewItem设置默认视觉行为,并允许我在使用用户控件时为这些TreeViewItem设置Style

提前谢谢。

更新:

异常消息:

System.Windows.Markup.XamlParseException:"设置属性"System.Windows.ResourceDictionary.DeferrableContent"引发异常。"行号"22"和行位置"14">

内部异常:

InvalidOperationException:无法重新初始化ResourceDictionary实例。

最初的问题是因为控件不能有两个资源部分。它们发生碰撞。

由于这个想法是将树视图本身作为控件公开,因此您需要一些其他方式来传递额外的样式。一种方法是使用依赖属性。然后,控件本身中的代码可以获取传入的任何内容,并将其添加到已有的样式中。这不是一个很好的解决方案,但它的好处是可以相当直接地进行控制,而不会强迫您重做控件的工作方式。

最新更新