コード内のリソース ディクショナリに DataTemplate (非 XAML) を追加しますか?
-
21-09-2019 - |
質問
DataTemplate をアプリのリソース ディクショナリに追加する方法を見つけようとしています。DataTemplate が XAML 内にある場合 (URI を介して) 行う方法についてはよく知っていますが、DataTemplate がコード内で定義されている場合の方法についてはちょっとわかりません。
私が持っているものは機能していませんが、
//Create DataTemplate
DataTemplate template = new DataTemplate(typeof(CoordinateViewModel));
FrameworkElementFactory ViewStack = new FrameworkElementFactory(typeof(CoordinateView));
ViewStack.Name = "myViewStack";
template.VisualTree = ViewStack;
ResourceDictionary dictionary = new ResourceDictionary();
dictionary.BeginInit();
dictionary.Add(template, template);
dictionary.EndInit();
App.Current.Resources.MergedDictionaries.Add(dictionary);
編集:できる限り、エラーをスローしていないにもかかわらず、DataTemplate がアプリのリソース ディクショナリに組み込まれないようにします。ViewModel が後で XAML から呼び出されるとき、それを表示するための適切な DataTemplate がないかのように動作します。例えば、
<StackPanel>
<ContentPresenter Content="{Binding ViewModel}" />
</StackPanel>
空のウィンドウに「ShellPrototype.ViewModels.CoownedViewModel」というテキストが表示されます。たとえば、ビューを表示するためのテンプレートがありません。
解決
これを正しく機能させるためにここで重要なのは、次のようにすることです。 データテンプレートキー:
ResourceDictionary dictionary = new ResourceDictionary();
dictionary.Add(new DataTemplateKey(typeof(CoordinateViewModel)), template);
これを実行すると、指定どおりに動作するはずです。しかし フレームワーク要素ファクトリー ドキュメントによると、これは「プログラムでテンプレートを作成する非推奨の方法」であるため、XAML を直接解析することをお勧めします。
所属していません StackOverflow