0

WinRT XAML を使用しています。WinRT で独自の HirarchicalDataTemplate を作成しようとしています。クラスを DataTemplate から継承しました。

public class HierarchicalDataTemplate : DataTemplate
{}

しかし、ページ リソースで新しい HierarchicalDataTemplate を初期化しようとすると、コンパイル時に次のエラーが表示されます。

HierarchicalDataTemplate に「テンプレート」の定義が含まれていません。

解決方法のアイデア。

4

3 に答える 3

1

昨日、Silverlight Toolkitからコントロールを移植することにようやく取り掛かりましたTreeView。これは、データにバインドされていない使用にはそれほど難しくありませんでしたが、その後、同じ問題が発生しました。私の解決策は、の代わりに通常DataTemplateのforを使用し、から派生するTreeView.ItemTemplateように変更して、プロパティ( )を付けてにアタッチすることでした。ここでサンプルを確認できます。HierarchicalDataTemplateFrameworkElementDataTemplateItemTemplateDataTemplateExtensions.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

これは厄介な問題であり、これがあなたが本当に見たいと思うテンプレートであることには同意します。実際に継承して適切に動作させることができるようには見えません.WinRTDataTemplateによって提供されるコントロールの多くは、複数の理由でユーザープログラムによる継承をサポートしていません.Template心に)。

ただし、HierarchicalDataTemplate純粋にカスタム コントロールに を使用しているように見えるため、実際には を継承する必要はまったくありません。これはDataTemplate、 がいつ収集されるかを完全に制御できるためですDataTemplate(自分だけがそれを呼び出しLoadContent()てコントロールに入力できます)。 )。DataTemplate代わりに、必要な追加のデータ フィールドと動作を備えたカスタム クラスを作成してから、参照およびインスタンス化されるを含むプロパティを作成することをお勧めします。実際、属性を使用することで、プロパティと のプロパティをContentPropertyスキップして、XAML ユーザーにから継承しかのように見せることさえできる場合があります。ItemTemplateDataTemplateTemplateDataTemplate

于 2013-06-17T16:06:20.563 に答える
0

の WinRT バージョンにはパブリックプロパティDataTemplateがありません。TemplateContentPropertyとして指定されているTemplateので、次のように変更してみました。

[ContentProperty(Name = "MyTemplate")]

Templateただし、エラーは解決しません。コード生成は、XamlTypeInfo.g.cs から、同じようにプロパティのエントリを追加しようとします。

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

別のコンテンツ プロパティを使用するには、非DataTemplateサブクラスを使用してtype のTemplateとの両方を定義します。またはサブクラス化を続行し、ダミープロパティを実装し、別のプロパティを使用して実際のコンテンツ テンプレートをホストします。これはプッシュ時に使用できる可能性がありますが、テンプレートをタイプ プロパティで使用することはできません。ItemTemplateDataTemplateDataTemplateTemplateMyTemplateDataTemplate

DataTemplateサブクラスを機能させようとして、次のタイプのプロパティを追加してみましTemplateobject:

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 には、その XAML コンテンツ プロパティの名前が "Template" であることを示す ContentPropertyAttribute があります。FrameworkTemplate はその名前のプロパティを定義しておらず、実用的な使用法を持つその派生型 (ControlTemplate、DataTemplate) も定義していません。FrameworkTemplate のコンテンツは、テンプレートの適用時に作成する必要があるルート要素であり、オブジェクト モデルの従来のプロパティではありません。FrameworkTemplate のコンテンツは、コンテンツがテンプレートから作成されるときに、XAML パーサーによって特別に処理されます。

あまり期待できそうにありません。

于 2013-01-18T13:12:09.517 に答える