【问题标题】:DataTemplate within a DataTemplateSelector referencing the parent DataTemplateSelector?引用父 DataTemplateSelector 的 DataTemplateSelector 中的 DataTemplate?
【发布时间】:2014-03-01 02:32:43
【问题描述】:

我有想要显示的具有不同属性的 ListView,其中一些是列表本身。这些子列表将使用与父列表中相同的 DataTemplates(但要缩进)。

有没有办法让子列表(虽然我使用的是 ItemsControl,所以我不必担心滚动)演示者引用它正在定义的 DataTemplateSelector?

如:

<ListView ItemTemplateSelector={StaticResource MyDataTemplateSelector}.../>

<selectors:MyDataTemplateSelector x:Key="MyDataTemplateSelector">
    <selectors:MyDataTemplateSelector.ListTemplate>
        <DataTemplate>
            <StackPanel>
                <!-- Referring to the selector it is being defined in -->
                <ItemsControl ItemTemplateSelector="{StaticResource MyDataTemplateSelector}"/>
            </StackPanel>
        </DataTemplate>
    </selectors:MyDataTemplateSelector.ListTemplate>
</selectors:MyDataTemplateSelector>

它编译得很好,但似乎在加载时崩溃并在 Windows.UI.Xaml 中出现错误。我认为这是因为它是循环引用。是否可以通过TemplatedParent 绑定完成?我一直在尝试一些不同的配置,但它们似乎不起作用。

【问题讨论】:

  • 看起来很糟糕。尝试创建一个不同名称的选择器副本以确认循环引用问题。

标签: c# xaml windows-runtime windows-store-apps winrt-xaml


【解决方案1】:

我没有按预期工作,但最终以另一种方式解决了它。这不会扩展到所有方法。我基本上创建了一个 2 深度树。我一直在寻找一种适用于任何深度树的方法,但找不到理想的方法。它可能需要一个自定义控件。但是,我确实有一个 2 深度树的答案。

使用ListView,我按顶部节点对项目进行分组,然后将我的选择器用于GroupHeaderTemplateSelectorItemTemplateSelector 的模板。

我认为可以通过使每个级别本身成为一个组并通过ListView 显示每个级别来将其扩展到 N 深度树,无论它是否有项目。这可能非常低效,但可能适用于其他需要它的人。也可以使用Linq 以一种相当简单的方式构造树,所以至少是这样。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,并且到处寻找“n”深度树的解决方案。我想出了一个解决方案,虽然我不是特别喜欢我的解决方案,但我最终将所有子列表滚动到我的主要级别。我保留了父母的参考资料,这样如果他们有父母,我就知道如何显示它们。

    这样我就不需要“MyDataTemplateSelector”中的 ItemsControl。只是一个想法,我想知道您对此有何看法。

    【讨论】:

      猜你喜欢
      • 2011-01-06
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      相关资源
      最近更新 更多