0

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

public class HierarchicalDataTemplate : DataTemplate
{}

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

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

任何想法如何解决。

4

3 回答 3

1

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

<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>
于 2013-03-02T05:35:23.140 回答
0

WinRT 版本DataTemplate没有公共Template属性。被ContentProperty指定为Template,所以我尝试改变它:

[ContentProperty(Name = "MyTemplate")]

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

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

要使用不同的内容属性,我们可以使用非子DataTemplate类并同时定义TemplateItemTemplate类型DataTemplate;或者继续继承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文档:

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

看起来不太有希望。

于 2013-01-18T13:12:09.517 回答
0

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

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

于 2013-06-17T16:06:20.563 回答