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

时间:2015-01-23 03:44:40

标签: xaml winrt-xaml windows-8.1 win-universal-app

我有一个Windows 8.1应用程序。我需要根据特定值选择不同的模板。为此,我在xaml中使用ContentPresenter和静态资源TemplateSelector。

这是我在xaml资源中的datatemplates和templateselector

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

}

但它根本没有达到模板选择器代码。运行应用程序时,绑定的字符串将直接显示在显示屏上。

如果有人指出我正确的方向,我会很高兴的。在此先感谢。

2 个答案:

答案 0 :(得分:4)

基本上,您只是覆盖其中一个SelectTemplateCore重载。

来自DataTemplateSelector文档:

  

要定义有效的DataTemplateSelector子类,请提供SelectTemplateCore(Object)SelectTemplateCore(Object, DependencyObject)的实现

SelectTemplateCore(Object, DependencyObject)提供实施后,将调用它。

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

我问谷歌为什么会这样,并找到this discussion。从它:

  

当与绑定到视图模型的ContentTemplateSelector属性一起使用时,ContentControl和ContentPresenter在Windows RT中似乎已损坏。 &#39;对象&#39;模板选择器的参数始终为null。

在讨论结束时,还有解决此问题的方法。

希望这会有所帮助。 :)

答案 1 :(得分:3)

使用ContentControl代替ContentPresenter对我有用。感谢@KaiBrummund对我的问题的评论。