【问题标题】:UWP TreeView ItemTemplateSelector not workingUWP TreeView ItemTemplateSelector 不工作
【发布时间】:2018-11-04 02:28:57
【问题描述】:

这个问题的WPF版本是here:但是还没有回答,不知道UWP TreeView会不会有同样的答案。

我正在尝试将 DataTemplateSelector 添加到刚刚添加到 Windows 10 版本 1803 的新 UWP TreeViews 但它不起作用。它记录了here 如何使用 XAML TreeView 控件,甚至显示了如何修改模板以更改工作正常的项目数据模板。我需要使用数据模板选择器,因为我的每个节点都使用不同的对象,并且我需要它们以不同的方式显示。 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>

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

【问题讨论】:

  • 您能提供一个minimal reproducible example吗?然后,我可以帮助您诊断我这边的这个问题。
  • 查看我在原始问题中发布的链接,那里有来自 Microsoft 的完整示例。正如我在问题中所说的,我唯一改变的是使用 DataTemplateSelector 而不是单个 Datatemplate。根据他们的示例,看看您是否可以使用数据模板选择器。更改模板的具体示例在页面底部。
  • 这个链接好像坏了,打不开。
  • 我想看看CardSelector 类和两个DataTemplates。

标签: c# xaml uwp treeview datatemplateselector


【解决方案1】:

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

是的。 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>

到目前为止,我已经回答了您的问题。但我还是想让你知道How to ask a good question。在我上面的 cmets 中,我要求您提供相关代码,然后我可以快速重现您的问题并帮助您诊断它。但是你说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.。没关系。你可以看到只有我回复了。你问这个问题好几天了。没有其他社区成员帮助您解决这个问题。这就是为什么我要求你在这里发布一些代码。如果您在这里提供相关代码,相信很多社区成员会很乐意在这个问题上为您提供帮助。我真的希望你能理解它。

【讨论】:

  • 感谢您展示一些我可以学习的东西,但没有什么不好的问题。
  • 非常感谢您的帮助。我尝试了十几种不同的方式,但无法让它工作,那么当我只需要有人发布一种可行的方式时,我为什么要发布十几种不同的方式完成的非工作代码呢?这不合逻辑
  • @beatnikthedan 没关系。你试过我的代码示例吗?对我来说效果很好。
  • 抱歉,还没有……被牵扯到另一件事上。我会尽快尝试并告诉你,但如果你说一切都很好,那么我相信它会起作用
  • 抱歉花了这么长时间重播,这一切都给我积压了。我很确定我找到了问题所在。在我所有的数据模板选择器中,我使用带有两个参数的第二个重载。使用 Treeview,对象总是作为 Null 传递。在只有一个参数的模板选择器类中使用第一个方法似乎可以正常工作。因此,无论出于何种原因,对于树视图模板选择器,您都不能在模板选择器类中使用第二个重载。谢谢你的帮助,我看了你的例子就明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
相关资源
最近更新 更多