質問
基本的には次のことをしたいのですが、できないようです。
UserControl myControl = new UserControl();
DataTemplate template = new DataTemplate(myControl);
質問:UserControlインスタンスからDataTemplateを構築することは可能ですか?そうでない場合、他に考えられる解決策はありますか?
本当の問題
私は、UIビューの大部分が単純な静的なWordのようなドキュメントであるプロジェクトに取り組んでいます(たとえば、いくつかのテキストフィールドやいくつかの画像、あまり派手ではありません)。このプロジェクトに取り組んでいる人のほとんどはコーダーではないため、UI生成用の非常にシンプルな社内マークアップ言語を設計しました。シンプルビューのマークアップの例は次のとおりです。
First name: [Person.FirstName]
Last name: [Person.LastName]
Address: [Person.Address.Street], [Person.Address.City]
これで、これらのテンプレートが実行時にロードされ、それらに基づいてユーザーコントロールが作成されます。この場合、1つのユーザーコントロールが作成され、スタックパネルとテキストブロックが2つだけ含まれるため、結果のコントロールはテキストドキュメントのように見えます。XAMLに相当するものは次のようになります。
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="First name: "/>
<TextBlock Text={Binding Person.FirstName}
</StackPanel>
<StackPanel>
...
</StackPanel>
...
</StackPanel>
それから、リストのサポートを実装し始めましたが、それを行う方法を考えることができませんでした。理論的には単純で、次の構文(+ XAMLに相当)を思いつきました。
[List Customers]
First name: [Person.FirstName]
Last name: [Person.LastName]
Address: [Person.Address.Street], [Person.Address.City]
[EndList]
->
<StackPanel>
<ItemsControl ItemsSource="{Binding Customers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
[Insert code from previous XAML example here]
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
しかし、UserControlインスタンスから直接DataTemplateを構築できないように思われるため、これを行うことはできません。私のUserControlsがタイプであれば問題はありませんが、そうではありません。
考えられる解決策の1つは、ItemsControl.ItemsをUserControlsのリストに直接バインドすることです(ItemsSourceとItemTemplateにバインドする代わりに)が、いくつかの理由から、これはこの場合は最適ではありません。私は最初に他のいくつかの解決策を試してみることをいとわないでしょう!
アップデート
明確にするために:私が持っているのは、必要なコンテンツを含むUserControlクラスのプレーンインスタンスだけです。例えば
UserControl control = new UserControl();
var panel = new StackPanel();
panel.Children.Add(...);
panel.Children.Add(...);
control.Content = panel;
// How to use that control as ItemTemplate for ItemsControl?
// It seems that it is not possible directly but I want to
// know what my options are.
実行時に作成しているため、クラスがありません。また、非常に面倒なので、ILコードを発行して新しい型を動的に作成したくありません。