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

How to define a TreeViewItem Triggers in a TreeView user control

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

<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 两次。即使我设法以某种方式设置 TreeViewItems 的样式,我想要的 TreeViewItems 的视觉行为也会被覆盖。

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

提前致谢。

更新:

异常信息:

System.Windows.Markup.XamlParseException: ''设置 属性 'System.Windows.ResourceDictionary.DeferrableContent' 抛出异常。行号“22”和行位置“14”。'

内部异常:

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

最初的问题是因为一个控件不能有两个资源部分。他们相撞了。

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