2013-01-15 42 views
0

我正在使用WinRT XAML。我試圖在WinRT中創建自己的HirarchicalDataTemplate。我從DataTemplate繼承了我的類。在WinRT中繼承DataTemplate

public class HierarchicalDataTemplate : DataTemplate 
{} 

但是當我嘗試在我的頁面資源中初始化一個新的HierarchicalDataTemplate時,它在編譯時顯示如下錯誤。

HierarchicalDataTemplate不包含'模板'的定義。

任何想法如何解決。

+0

您是否嘗試從Silverlight Toolkit移植一個?我打算在某些時候和TreeView控件一起做。它在Silverlight4 \ Source \ Controls \ Data \ HierarchicalDataTemplate.cs中 –

+0

WinRT中的問題是從DataTemplate繼承一個類。這導致上述錯誤。我希望Silverlight工具包中的HierarchicalDataTemplate也是從DataTemplate繼承的。 – Jawahar

回答

0

WinRT版本DataTemplate沒有公開Template屬性。該ContentProperty被指定爲Template,所以我試圖改變的是:

[ContentProperty(Name = "MyTemplate")] 

但錯誤依然存在:代碼生成試圖添加一個條目爲Template性質都是一樣的,從XamlTypeInfo.g.cs:

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

要使用不同的內容特性,我們可以使用一個非DataTemplate子類,並同時定義TemplateDataTemplate類型的ItemTemplate;或繼續子類DataTemplate,實施虛擬Template屬性,並使用單獨的MyTemplate屬性託管實際的內容模板。這可能在推送時可用,但不能使模板在DataTemplate類型屬性中使用。

試圖讓DataTemplate子類的工作,我嘗試添加objectTemplate屬性:

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文檔:

Framewo rkTemplate具有ContentPropertyAttribute,它指示其XAML內容屬性被命名爲「模板」。 FrameworkTemplate沒有定義該名稱的屬性,也沒有定義具有實際用法的派生類型(ControlTemplate,DataTemplate)。 FrameworkTemplate的內容是應用模板時應創建的根元素,並且不是對象模型中的常規屬性。當從模板創建內容時,FrameworkTemplate的內容由XAML解析器專門處理。

它看起來不太有希望。

+0

實際上,在運行時,如果繼續使用不接觸Template的子類,並且編輯生成的XamlTypeInfo.g.cs,但是不知道如何將其轉化爲適當的解決方案,那麼這些東西似乎「工作」。 –

1

昨天我終於輪到從Silverlight Toolkit中移植了TreeView控件,這對於非數據綁定的使用來說並不難,但是我遇到了同樣的問題。我的解決方法是對TreeView.ItemTemplate使用常規DataTemplate,然後修改HierarchicalDataTemplate以從FrameworkElement而不是DataTemplate派生出來,並將其附加到帶有附加屬性(DataTemplateExtensions.Hierarchy)的ItemTemplate。您可以檢查樣本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> 
0

我同意這是一個棘手的問題,這是一個你真的很想看到的模板。它看起來並不像你實際上可以從DataTemplate繼承並使它正常工作 - 由於多種原因,WinRT提供給你的許多控件不支持用戶程序的繼承(數據結構和voodoo上的私有構造函數,如Template財產浮現在腦海中)。

但是,因爲它似乎,如果你使用的是HierarchicalDataTemplate完全自定義的控制,你其實並不需要,因爲你有當DataTemplate收穫完全控制從DataTemplate繼承所有(你,只有你可以請撥打LoadContent()來填充您的控件)。相反,您最好的選擇是創建一個自定義類,它具有您需要的任何額外數據字段和行爲,然後是包含被引用和實例化的DataTemplate的屬性。事實上,通過使用ContentProperty屬性,你甚至可以跳過ItemTemplate屬性和DataTemplateTemplate財產,使它看起來你的XAML的用戶,如果你沒有DataTemplate繼承。