UWP TreeView ItemTemplateSelector 不起作用

问题描述 投票:0回答:2

这个问题的WPF版本是这里:但是还没有得到解答,我不知道UWP TreeView是否会有相同的答案。

我正在尝试将 DataTemplateSelector 添加到刚刚添加到 Windows 10 版本 1803 的新 UWP TreeView,但它不起作用。 here记录了如何使用 XAML TreeView 控件,甚至展示了如何修改模板以更改项目数据模板,效果很好。我需要使用数据模板选择器,因为我的每个节点都使用不同的对象,并且我需要它们以不同的方式显示。 TreeView.Node.Content 设置得很好,除了将 null 传递给对象参数中的 datatemplateselector 之外,一切正常。

这是我的代码:(与 Microsoft 的示例相同,只是使用 ItemTemplateSelector)

<Style TargetType="TreeView">
        <Setter Property="IsTabStop" Value="False" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TreeView">
                    <TreeViewList x:Name="ListControl"
                                      ItemTemplateSelector="{StaticResource CardSelector}"
                                      ItemContainerStyle="{StaticResource TreeViewItemStyle}"
                                      CanDragItems="True"
                                      AllowDrop="True"
                                      CanReorderItems="True">
                        <TreeViewList.ItemContainerTransitions>
                            <TransitionCollection>
                                <ContentThemeTransition />
                                <ReorderThemeTransition />
                                <EntranceThemeTransition IsStaggeringEnabled="False" />
                            </TransitionCollection>
                        </TreeViewList.ItemContainerTransitions>
                    </TreeViewList>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

有人对此有任何见解或经验吗?我的数据模板选择器“CardSelector”工作正常,我已经在几个地方使用它,没有任何问题。

c# xaml uwp treeview datatemplateselector
2个回答
1
投票

所以我的问题的重点不是得到任何我正在工作的东西,而是看看 TreeViewControl 是否与 DataTemplateSelector 一起工作。我那里只有“CardTemplateSelector”,因为我在应用程序的其他几个地方使用它,并且我知道它有效。我的问题实际上是“是的,树视图可以与选择器一起使用”或“不,它不能”我真的在寻找其他人使用他们自己的测试模板选择器进行尝试,并让我知道他们是否可以使其工作。我的任何具体代码与该问题无关。只是看看你是否可以让它与你想要的任何选择器一起工作

是的。 TreeView 与

ItemTemplateSelector
配合得很好。

我使用了文档中的所有代码并创建了一个自定义类,如下所示:

public class Test
{
    public string Name { get; set; }
}

我制作了另一个这样的数据模板:

<DataTemplate x:Key="TreeViewObjDataTemplate">
        <Grid Height="44">
            <TextBlock
                Text="{Binding Content.Name}"
                HorizontalAlignment="Left"
                VerticalAlignment="Center"
                Style="{ThemeResource BodyTextBlockStyle}"/>
        </Grid>
</DataTemplate>

我的

CardTemplateSelector
课程如下:

public class CardTemplateSelector: DataTemplateSelector
{
    public DataTemplate TreeViewItemDataTemplate { get; set; }
    public DataTemplate TreeViewObjDataTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item)
    {
        TreeViewNode treeViewNode = item as TreeViewNode;
        if (treeViewNode.Content is StorageFolder|| treeViewNode.Content is StorageFile)
        {
            return TreeViewItemDataTemplate;
        }
        if (treeViewNode.Content is Test)
        {
            return TreeViewObjDataTemplate;
        }

        return base.SelectTemplateCore(item);
    }

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        return SelectTemplateCore(item);
    }
}

我只是在

MainPage.xaml.cs
中添加新行代码:

TreeViewNode objnode = new TreeViewNode();
Test test = new Test() {Name="Parent"};
objnode.Content = test;
objnode.IsExpanded = true;
objnode.HasUnrealizedChildren = true;
sampleTreeView.RootNodes.Add(objnode);

以下是整个xaml页面资源代码:

    <Page.Resources>
    <DataTemplate x:Key="TreeViewItemDataTemplate">
        <Grid Height="44">
            <TextBlock
                Text="{Binding Content.DisplayName}"
                HorizontalAlignment="Left"
                VerticalAlignment="Center"
                Style="{ThemeResource BodyTextBlockStyle}"/>
        </Grid>
    </DataTemplate>

    <DataTemplate x:Key="TreeViewObjDataTemplate">
        <Grid Height="44">
            <TextBlock
                Text="{Binding Content.Name}"
                HorizontalAlignment="Left"
                VerticalAlignment="Center"
                Style="{ThemeResource BodyTextBlockStyle}"/>
        </Grid>
    </DataTemplate>

    <local:CardTemplateSelector x:Name="CardTemplateSelector" TreeViewItemDataTemplate="{StaticResource TreeViewItemDataTemplate}" TreeViewObjDataTemplate="{StaticResource TreeViewObjDataTemplate}"></local:CardTemplateSelector>
    
    <Style TargetType="TreeView">
        <Setter Property="IsTabStop" Value="False" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TreeView">
                    <TreeViewList x:Name="ListControl"
                                  ItemTemplateSelector="{StaticResource CardTemplateSelector}"
                                  ItemContainerStyle="{StaticResource TreeViewItemStyle}"
                                  CanDragItems="True"
                                  AllowDrop="True"
                                  CanReorderItems="True">
                        <TreeViewList.ItemContainerTransitions>
                            <TransitionCollection>
                                <ContentThemeTransition />
                                <ReorderThemeTransition />
                                <EntranceThemeTransition IsStaggeringEnabled="False" />
                            </TransitionCollection>
                        </TreeViewList.ItemContainerTransitions>
                    </TreeViewList>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Page.Resources>


0
投票

对于在哪里应用 DataTemplate 似乎存在困惑。并且所有重要的 TargetType 都会被忽略。

如果您想要自定义 DataTemplateSelector 中数据项的句柄,您需要:

选项 1

  • 在 TreeView.ItemTemplateSelector 上应用 DataTemplateSelector
  • 确保 DataTemplates 将 TreeViewNode 作为目标类型。

只有这样,TreeViewNode 的数据项才会提供给自定义 DataTemplateSelector 的 SetTemplateCore(object item) 和 SetTemplateCore(object item, DependencyObject container) 覆盖。 在这里可以找到一个工作示例:图片和音乐库树视图

选项 2

  • 在 TreeViewItem.ContentTemplateSelector 上应用 DataTemplateSelector
  • 确保数据模板具有 [您的数据类型] 作为目标类型
  • 在 TreeView.ItemTemplate 中将 DataContext AND Content 属性绑定到 [YOUR-DATA-TYPE],即
<TreeView.ItemTemplate>
    <DataTemplate x:DataType="[YOUR-DATA-TYPE]">
        <TreeViewItem DataContext="{Binding}" ... Content="{Binding}">
            <TreeViewItem.ContentTemplateSelector>
                <YourDataTemplateSelector.TemplateA>
                    <DataTemplate x:DataType="[YOUR-DATA-TYPE]">
                        ...
// YourDataTemplateSelector
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        if (item == null) return null;
        return (([YOUR-DATA-TYPE])item).IsSomething ? TemplateA : TemplateB;
    }
© www.soinside.com 2019 - 2024. All rights reserved.