我为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
,但它也没有帮助。
答案 0 :(得分:1)
我认为只有一种方式。
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的新实例:
公共类SelectedCategoryConverterCreatorExtension:MarkupExtension { 公共覆盖对象ProvideValue(IServiceProvider serviceProvider) { return new SelectedCategoryConverter(); } }
它将为每个项目创建一个SelectedCategoryConverter的新实例。但请记住,它的内存效率不高。