树视图项目容器样式的每项转换器实例

本文关键字:转换器 实例 样式 视图 项目 | 更新日期: 2023-09-27 18:16:01

我将ItemContainerStyle设置为TreeView,并使用MultiBinding中的转换器:

<TreeView>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsSelected">
                    <Setter.Value>
                        <MultiBinding Converter="{StaticResource SelectedCategoryConverter}" Mode="TwoWay">
                            <Binding Path="."/>
                            <Binding Path="CurrentCategoryId" RelativeSource="{RelativeSource AncestorType=UserControl}"/>
                        </MultiBinding>
                    </Setter.Value>
                </Setter>
                <Setter Property="IsExpanded" Value="True" />
            </Style>
        </TreeView.ItemContainerStyle>
</TreeView>

我需要为树视图中的每个唯一项创建SelectedCategoryConverter,所以我在窗口资源中使用x:Shared="False"声明它:

<local:SelectedCategoryConverter x:Shared="false" x:Key="SelectedCategoryConverter"/>

,但它没有帮助:只有一个实例的转换器被创建当2个或更多的项目通过ItemsSource传递给TreeView。我试图将转换器编写为MarkupExtension,但它也没有帮助。

树视图项目容器样式的每项转换器实例

我想只有一个办法。

1. 将ItemContainerStyle移到资源中,并标记为非共享:

<Application.Resources>
            <Style x:Key="TreeViewItemStyle" TargetType="{x:Type TreeViewItem}" x:Shared="False">
                <Setter Property="IsSelected">
                    <Setter.Value>
                        <MultiBinding Converter="{local:SelectedCategoryConverterCreator}" Mode="TwoWay">
                            <Binding Path="."/>
                            <Binding Path="CurrentCategoryId" RelativeSource="{RelativeSource AncestorType=UserControl}"/>
                        </MultiBinding>
                    </Setter.Value>
                </Setter>
                <Setter Property="IsExpanded" Value="True" />    
            </Style>
        </Application.Resources>
<TreeView ItemContainerStyle="{StaticResource TreeViewItemStyle}">
  • 创建您自己的MarkupExtension,它将创建一个SelectedCategoryConverter的新实例:

    公共类selectedcategoryconvertercreatoreextension: MarkupExtension{public override object ProvideValue(IServiceProvider){返回new SelectedCategoryConverter();}}

  • 它将为每个项目创建一个SelectedCategoryConverter的新实例。但是请记住,它不是很节省内存。