1

実行時に構築されるデータ テンプレートにデータ テンプレートをラップする必要があります。ラップされたデータ テンプレートは WPF 要素であり、ラッピング テンプレートはコードで作成する必要があります。何かのようなもの:

     public DataTemplate GetTemplate(DataTemplate template)
    {
        string xaml = string.Format(@"
<DataTemplate>
    <ContentControl Content=""{{Binding}}"">
        <ContentControl.ContentTemplate>
{0}
        </ContentControl.ContentTemplate>
    </ContentControl>
</DataTemplate>", template);
        return CreateTemplate(xaml);
    }

明らかに、私のデータテンプレートは、上記で使用しているものよりも複雑です。

とにかく、既存の xaml 要素を取得して文字列に変換する方法を知りません。FrameworkElementFactory を使用できるように思えますが、廃止されていることがわかります。これにより、明らかな何かが欠けていると思います。

編集 ---

私がやっていることは、ユーザーがデータテンプレートを提供するコントロールを作成することですが、テンプレートを変更する必要があります。たぶん、この例はもっと理にかなっています...

    public DataTemplate GetTemplate2()
    {
        // this template would be supplied by the user
        // I'm creating it here as an example
        string t = string.Format(@"
          <DataTemplate>
            <TextBlock Text=""{{Binding Value}}""/>
        </DataTemplate>");
        T = CreateTemplate(t);

        string xaml = string.Format(@"
<DataTemplate>
    <ContentControl Content=""{{Binding}}"">
        <ContentControl.ContentTemplate>
{0}
        </ContentControl.ContentTemplate>
    </ContentControl>
</DataTemplate>", t);
        return CreateTemplate(xaml);
    }

文字列テンプレート (t など​​) を使用しているため、これはすべて機能します。ただし、実際の DataTemplate (T など) を使用してそれを行う方法を見つける必要があります。残念ながら、XamlWriter は Binding を処理できません。

4

2 に答える 2

1

DataTemplate セレクターを作成できます。そこにロジックを追加して、実行時に DataTemplate を構築できます。また、DataTemplate セレクターで dependencyProperty を作成することもできます。次に、xaml でそれをバッキング モデルに格納されている DataTemplate にバインドします。

このリンクは、開始するのに適した場所かもしれません

于 2013-01-28T19:59:50.433 に答える
0

XamlWriter(XamlReaderのアナログ)を使用できますが、適切にシリアル化できるものに制限があります。イベントハンドラやx:Namesのようなものは問題を引き起こします。

**アップデート

追加の詳細を見ると、アプローチを逆にしてみるべきだと思います。文字列を使用してテンプレートを結合し、それを目的のオブジェクトに変換しようとするのではなく、ユーザーのテンプレートをDataTemplateオブジェクトとして作成し、その周りに独自のDataTemplateオブジェクトを作成するだけで、すべての奇妙な解析制限を回避できます。サンプルコードでも2つの値パスを使用しています。これにより、内側のテンプレートテキストに.Value.Valueが表示されるため、実際のパスで目的のパスになっていることを確認してください。代わりにオブジェクトを使用した例の基本を次に示します。パスは文字列を予期してその長さを表示するように更新されています。

DataTemplate T = XamlReader.Parse(string.Format(@"
    <DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>
        <TextBlock Text=""{{Binding}}""/>
    </DataTemplate>")) as DataTemplate;

FrameworkElementFactory controlFactory = new FrameworkElementFactory(typeof(ContentControl));
controlFactory.SetBinding(ContentControl.ContentProperty, new Binding("Length"));
controlFactory.SetValue(ContentControl.ContentTemplateProperty, T);

DataTemplate mainTemplate = new DataTemplate { VisualTree = controlFactory };
于 2013-01-28T19:12:13.687 に答える