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

时间:2015-10-05 16:11:59

标签: c# wpf data-binding

我为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 个答案:

答案 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}">
  1. 创建自己的MarkupExtension,它将创建SelectedCategoryConverter的新实例:

    公共类SelectedCategoryConverterCreatorExtension:MarkupExtension {     公共覆盖对象ProvideValue(IServiceProvider serviceProvider)     {         return new SelectedCategoryConverter();     } }

  2. 它将为每个项目创建一个SelectedCategoryConverter的新实例。但请记住,它的内存效率不高。