在WinRT中继承DataTemplate

时间:2013-01-15 14:48:06

标签: windows-runtime datatemplate

我正在使用WinRT XAML。我想在WinRT中创建自己的HirarchicalDataTemplate。我从DataTemplate继承了我的类。

public class HierarchicalDataTemplate : DataTemplate
{}

但是当我尝试在我的页面资源中初始化一个新的HierarchicalDataTemplate时,它会在编译时显示以下错误。

  

HierarchicalDataTemplate不包含“模板”的定义。

任何想法如何解决。

3 个答案:

答案 0 :(得分:1)

我终于完成了昨天从Silverlight Toolkit移植TreeView控件,这对于非数据绑定使用来说并不难,但后来我遇到了同样的问题。我的解决方案是对DataTemplate使用常规TreeView.ItemTemplate,然后将HierarchicalDataTemplate修改为从FrameworkElement而不是DataTemplate派生,并将其附加到ItemTemplate 1}}附加属性(DataTemplateExtensions.Hierarchy)。您可以查看示例 here

<xc:TreeView
    x:Name="tvDataBound"
    Grid.Row="1"
    Grid.Column="1"
    Style="{StaticResource TouchTreeViewStyle}"
    ItemContainerStyle="{StaticResource TouchTreeViewItemStyle}">
    <xc:TreeView.ItemTemplate>
        <DataTemplate>
            <data:DataTemplateExtensions.Hierarchy>
                <data:HierarchicalDataTemplate
                    ItemsSource="{Binding Children}" />
            </data:DataTemplateExtensions.Hierarchy>
            <StackPanel
                Orientation="Horizontal">
                <TextBlock
                    Text="{Binding Text}" />
                <Ellipse
                    VerticalAlignment="Center"
                    Margin="5"
                    Width="10"
                    Height="10"
                    Fill="{Binding Brush}" />
            </StackPanel>
        </DataTemplate>
        <!-- Original implementation based on Silverlight Toolkit didn't work:
        <data:HierarchicalDataTemplate
            ItemsSource="{Binding Children}">
            <StackPanel
                Orientation="Horizontal">
                <TextBlock
                    Text="{Binding Text}" />
                <Ellipse
                    VerticalAlignment="Center"
                    Margin="5"
                    Width="10"
                    Height="10"
                    Fill="{Binding Brush}" />
            </StackPanel>
        </data:HierarchicalDataTemplate>-->
    </xc:TreeView.ItemTemplate>
</xc:TreeView>

答案 1 :(得分:0)

DataTemplate的WinRT版本没有公共Template属性。 ContentProperty被指定为Template,因此我尝试更改它:

[ContentProperty(Name = "MyTemplate")]

但是错误仍然存​​在:代码生成尝试从XamlTypeInfo.g.cs中添加Template属性的条目:

userType.AddMemberName("MyTemplate");
userType.AddMemberName("Template");

要使用其他内容属性,我们可以使用非DataTemplate子类并定义Template类型的ItemTemplateDataTemplate;或继续子类DataTemplate,实现虚拟Template属性,并使用单独的MyTemplate属性来托管实际的内容模板。这可能在推送时可用,但不能允许模板在DataTemplate类型属性中使用。

尝试让DataTemplate子类起作用,我尝试添加Template类型的object属性:

public class HierarchicalDataTemplate : DataTemplate
{
    public object Template
    {
        get { return (object)GetValue(TemplateProperty); }
        set { SetValue(TemplateProperty, value); }
    }
    public static readonly DependencyProperty TemplateProperty =
        DependencyProperty.Register("Template", typeof(object), typeof(HierarchicalDataTemplate), new PropertyMetadata(null));
    // ItemTemplate...
}

这适用于Visual Studio设计器,但不适用于运行时:

<local:HierarchicalDataTemplate x:Key="t1">
    <TextBlock Text="SUCCESS" />
</local:HierarchicalDataTemplate>

来自FrameworkTemplate docs:

  

FrameworkTemplate有一个ContentPropertyAttribute,指示其XAML内容属性名为“Template”。 FrameworkTemplate不定义该名称的属性,也不定义具有实际用法的派生类型(ControlTemplate,DataTemplate)。 FrameworkTemplate的内容是应用模板时应创建的根元素,并且不是对象模型中的常规属性。当从模板创建内容时,FrameworkTemplate的内容由XAML解析器专门处理。

看起来并不太有希望。

答案 2 :(得分:0)

我同意这是一个令人烦恼的问题,而且这是你真正希望看到的模板。它看起来好像你实际上不能继承DataTemplate并使其正常工作 - WinRT为您提供的许多控件由于多种原因(数据结构上的私有构造函数和数据结构的私有构造函数)不支持用户程序的继承。我想到了Template属性的伏都教。

但是,由于您似乎纯粹使用HierarchicalDataTemplate自定义控件,因此您实际上根本不需要继承DataTemplate,因为您可以完全控制DataTemplate的时间1}}被收获(你只能在它上面调用LoadContent()来填充你的控件)。相反,您最好的选择是创建一个自定义类,该类具有您需要的任何额外数据字段和行为,然后是包含引用和实例化的DataTemplate的属性。实际上,通过使用ContentProperty属性,您甚至可以跳过ItemTemplate属性和DataTemplate的{​​{1}}属性,并使其适合您的XAML用户好像你 继承自Template

相关问题