我正在使用WinRT XAML。我想在WinRT中创建自己的HirarchicalDataTemplate。我从DataTemplate继承了我的类。
public class HierarchicalDataTemplate : DataTemplate
{}
但是当我尝试在我的页面资源中初始化一个新的HierarchicalDataTemplate时,它会在编译时显示以下错误。
HierarchicalDataTemplate不包含“模板”的定义。
任何想法如何解决。
答案 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
类型的ItemTemplate
和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 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
。