树视图项目容器样式的每项转换器实例
本文关键字:转换器 实例 样式 视图 项目 | 更新日期: 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的新实例。但是请记住,它不是很节省内存。