【问题标题】:How can I add additional item templates to an extended WPF treeview如何将其他项目模板添加到扩展的 WPF 树视图
【发布时间】:2012-11-15 22:45:15
【问题描述】:

我正在尝试设置一个可以用作通用模板的 Treeview 后代类 我的应用程序中的所有 Treeview 实例,但每个实例都有额外的格式和模板。

对于基础,我有一个继承自 Treeview 的 UserControl,具有通用样式和单个标准数据模板

<TreeView x:Class="BaseTreeView" ... >
    <TreeView.ItemContainerStyle> ... </TreeView.ItemContainerStyle>
    <TreeView.Resources>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}"  DataType="{x:Type local:BaseTreeViewItem}">
            <TextBlock Text="{Binding Caption}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

然后在每个窗口中,我使用这个扩展的 Treeview 并为我正在显示的特定 TreeviewItem 添加额外的数据模板。

例如

<Window x:Class="Window1" ... >
    ...
    <BaseTreeView ItemsSource="{Binding RootTreeItems}" >
        <MyTreeView.Resources>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}"  DataType="{x:Type ExtendedTreeViewItem1}">
                <StackPanel Orientation="Horizontal">
                    <Image Source="Images/Image1.png" />
                    <TextBlock Text="{Binding Caption}" />
                </StackPanel>
            </HierarchicalDataTemplate>
            <DataTemplate DataType="{x:Type ExtendedTreeViewItem2}">
                <StackPanel Orientation="Horizontal">
                    <Image Source="Images/Image2.png" />
                    <TextBlock Text="{Binding Caption}" />
                </StackPanel>
            </DataTemplate>
        </MyTreeView.Resources>
    </BaseTreeView>
    ...
</Window>

这编译得很好,但在运行时我得到一个错误

"'设置属性 'System.Windows.ResourceDictionary.DeferrableContent' 引发异常。'行号 '27' 和行位置 '59'。"

“无法重新初始化 ResourceDictionary 实例。”

有什么办法可以解决这个问题,或者有人可以建议一种更好的方法来设置基本树视图模板和多个后代版本。

【问题讨论】:

  • 看起来它对设置资源两次感到不满,所以你必须删除一个。也许在以后的事件中以编程方式填充基本控件(BaseTreeView)资源?加载,也许?不得不放弃代码,但会解决眼前的问题。

标签: wpf treeview


【解决方案1】:

您可以尝试将模板移动到 &lt;Window.Resources&gt; 而不是 &lt;MyTreeView.Resources&gt;

如果它不起作用,也许使用 DataTemplateSelector 最适合您的情况。您可以像这样创建一个 DataTemplateSelector 类:

public class ExtendedTreeViewTemplateSelector : DataTemplateSelector
{
    public DataTemplate ExtendedTreeViewItem1Template { get; set; }
    public DataTemplate ExtendedTreeViewItem2Template { get; set; }


    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is ExtendedTreeViewItem1)
            return ExtendedTreeViewItem1Template;
        if (item is ExtendedTreeViewItem2)
            return ExtendedTreeViewItem2Template;
    }
}

然后像这样在你的 XAML 中使用它:

<Window x:Class="Window1" ... >
    <Window.Resources>
        <HierarchicalDataTemplate x:Key="extendedTreeViewItem1Template" ItemsSource="{Binding Children}"  DataType="{x:Type ExtendedTreeViewItem1}">
            <StackPanel Orientation="Horizontal">
                <Image Source="Images/Image1.png" />
                <TextBlock Text="{Binding Caption}" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <DataTemplate x:Key="extendedTreeViewItem2Template" DataType="{x:Type ExtendedTreeViewItem2}">
            <StackPanel Orientation="Horizontal">
                <Image Source="Images/Image2.png" />
                <TextBlock Text="{Binding Caption}" />
            </StackPanel>
        </DataTemplate>
        <selector:ExtendedTreeViewTemplateSelector x:Key="treeViewTemplateSelector"
                                                   ExtendedTreeViewItem1Template="{StaticResource extendedTreeViewItem1Template}"
                                                   ExtendedTreeViewItem2Template="{StaticResource extendedTreeViewItem2Template}" />
    </Window.Resources>
    ...
    <BaseTreeView ItemsSource="{Binding RootTreeItems}"
                  ItemTemplateSelector={StaticResource treeViewTemplateSelector}" />
    ...
</Window>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多