XAML UWP树视图项目模板选择器不工作

kmynzznz  于 2023-01-10  发布在  其他
关注(0)|答案(2)|浏览(176)

这个问题的WPF版本是here:,但它还没有得到回答,我不知道UWP TreeView是否会有相同的答案。
我试图添加一个DataTemplateSelector到新的UWP树视图,刚刚添加到windows 10版本1803,但它不工作。它记录了here如何使用XAML树视图控件,甚至显示了如何修改模板,以改变项目数据模板,工作正常。我需要使用一个数据模板选择器,因为我的每个节点都使用不同的对象,我需要它们以不同的方式显示。内容设置得很好,除了在Object参数中将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>

有没有人对此有什么见解或经验?我的datatemplateselector "cardselector"工作正常,我已经在几个地方使用过了,没有任何麻烦。

wecizke3

wecizke31#

所以我的问题不是让我的任何东西工作,而是看看TreeViewControl是否与DataTemplateSelector一起工作。我只有“CardTemplateSelector”在那里,因为我在我的应用程序的其他几个地方使用它,我知道它工作。我的问题实际上是“是的,treeview工作与选择器”或“不,它不”我真的在寻找别人尝试与自己的测试模板选择器,并让我知道,如果他们可以得到它的工作。任何具体的代码从我是不相关的问题。只是看看你能让它与任何选择器你想要的工作
是的。TreeView与ItemTemplateSelector配合良好。
我使用了文档中的所有代码并创建了一个自定义类,如下所示:

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

我创建了另一个DataTemplate,如下所示:

<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>

到目前为止我已经回答了你的问题。但是我仍然想让你知道How to ask a good question。在我上面的评论中,我要求你提供相关的代码,那我就可以快速重现你的问题,帮你诊断一下,但是你说I'm really looking for someone else to try it with their own test template selector and to let me know if they can get it working.,没关系,你看就我一个人回复,你问了好多天这个问题,没有其他社区成员帮你这个问题,那'这就是为什么我要求你在这里贴一些代码。如果你在这里提供相关的代码,我相信很多社区成员会很乐意帮助你解决这个问题。我真的希望你能理解。

ha5z0ras

ha5z0ras2#

似乎对在哪里应用数据模板感到困惑。而且所有重要的TargetType都被忽略了。
如果要在自定义DataTemplateSelector中的数据项上设置句柄,则需要:

    • 选项1**
  • 在树视图上应用数据模板选择器。
  • 确保数据模板具有TreeViewNode作为目标类型。

只有这样,TreeViewNode的数据项才会提供给自定义DataTemplateSelector的SetTemplateCore(对象项)和SetTemplateCore(对象项,DependencyObject容器)重写。图片和音乐库树视图

    • 备选案文2**
  • 将数据模板选择器应用于树视图项。内容模板选择器
  • 确保数据模板的目标类型为**[YOUR-DATA-TYPE]**
  • 在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;
    }

相关问题