如何在 Windows 8.1 中的 ContentPresenter 中使用模板选择器

How to use template selector within a ContentPresenter in Windows 8.1

我有一个 Windows 8.1 应用程序。我有根据特定值选择不同模板的要求。为此,我将 xaml 中的 ContentPresenter 与静态资源模板选择器一起使用。

这是我在 xaml 资源

中的数据模板和模板选择器
    <DataTemplate x:Key="template1">
        <TextBox Text="Temp 1" />
    </DataTemplate>

    <DataTemplate x:Key="template2">
        <TextBox Text="Temp 2" />
    </DataTemplate>

    <DataTemplate x:Key="template3">
        <TextBox Text="Temp 3" />
    </DataTemplate>

    <template:BalanceTypesTemplateSelector x:Key="MySelector"
                                           Template1="{StaticResource template1}"
                                           Template2="{StaticResource template2}"
                                           Template3="{StaticResource template3}" />

这是我的 ContentPresenter XAML

<ContentPresenter ContentTemplateSelector="{StaticResource MySelector}"
                                                Content="{Binding MyData}" />

这是我的模板选择器代码

public class BalanceTypesTemplateSelector : DataTemplateSelector
{
    public DataTemplate Template1 { get; set; }
    public DataTemplate Template2 { get; set; }
    public DataTemplate Template3 { get; set; }

    protected override DataTemplate SelectTemplateCore(object item)
    {
            var type = item.ToString();
            switch (type)
            {
                case "t1":
                    return Template1;
                case "t2":
                    return Template1;
                case "t3":
                    return Template3;
                default:
                    throw new NotSupportedException();
            }
        }

        return null;
    }

}

但它根本没有命中模板选择器代码。当我运行应用

时,绑定的字符串直接显示在显示器上

如果有人指出正确的方向,我会很高兴。提前致谢。

基本上,您只是覆盖了 SelectTemplateCore 重载之一。

来自 DataTemplateSelector 文档:

To define an effective DataTemplateSelector subclass, provide implementations for SelectTemplateCore(Object) and SelectTemplateCore(Object, DependencyObject)

一旦您为 SelectTemplateCore(Object, DependencyObject) 提供了实现,它就会被调用。

我尝试这样做,但我遇到了另一个问题 - 对象始终为 null(而不是 ContentPresenter 的 Content/DataContext)。

我问 Google 为什么会这样,结果发现 this discussion。来自:

The ContentControl and ContentPresenter appear to be broken in Windows RT when used with a ContentTemplateSelector property bound to a view model. The 'object' parameter to the template selector is always null.

在该讨论的最后还有一个解决此问题的方法。

希望这对您有所帮助。 :)

使用 ContentControl 而不是 ContentPresenter 对我有用。感谢@KaiBrummund 对我的问题的评论。