UWP TreeView ItemTemplateSelector不工作

时间:2018-05-24 19:05:40

标签: c# xaml uwp treeview datatemplateselector

此问题的WPF版本为here:但尚未得到解答,我也不知道UWP TreeView是否会有相同的答案。

我试图将DataTemplateSelector添加到刚刚添加到Windows 10版本1803的新UWP TreeView中,但它不起作用。记录here如何使用XAML TreeView控件,甚至显示如何修改模板以更改可正常工作的Item Datatemplate。我需要使用datatemplate选择器,因为我的每个节点都使用不同的对象,我需要以不同的方式显示它们。 TreeView.Node.Content设置得很好,除了将null传递给Object参数中的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&#34; CardSelector&#34;工作正常,我一直在几个地方使用它没有任何麻烦。

1 个答案:

答案 0 :(得分:0)

  

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

是。 TreeView与ItemTemplateSelector配合良好。

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

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>

enter image description here

到目前为止,我已经回答了你的问题。但我仍然想让你知道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.。没关系。你可以看到只有我回复。你问这个问题很多天了。没有其他社区成员帮助您解决这个问题。这就是我要求你在这里发布一些代码的原因。如果您在此提供相关代码,我相信很多社区成员将很乐意帮助您解决这个问题。我真的希望你能理解它。