4

私は MVVM アーキテクチャを使用してアプリケーションを分離しています。つまり、次のようなものをよく見かけます

var u = new UserControl();
u.Content = new MyCustomType(); // MyCustomType is not a control

UI は、独自の XAML ファイルのリソース ディクショナリに存在するデータ テンプレートを介して定義されます。

<ResourceDictionary ...>
    <DataTemplate DataType="{x:Type local:MyCustomType}">
        ...

アプリケーションの起動時にリソースをロードすると、アプリケーションは喜んで UI を表示します。しかし、データ テンプレートを削除して新しいテンプレート (同じキー、同じデータ型) を追加すると、UI は古いデータ テンプレートを使用したままになります。もちろん、コンテナーのコンテンツをリセットして強制的に更新することもできますが、このように変更についてすべてのコントロールに通知する必要があるため、これはばかげているように思えます。

var tmp = control.Content;
control.Content = null;
control.Content = tmp; // New data template will be used

他のアプローチはありますか?

4

1 に答える 1

4

これは、リソースが辞書内で静的であるためです。一度使用すると、更新されません。辞書の再読み込みを試みることもできますが、古いコントロールではなく、新しいコントロールのみが更新されます。

複数の DataTemplates をサポートしたい場合は、条件に応じてテンプレートを選択する DataTemplateSelector クラスを検討できます: http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx

テンプレートを「その場で」切り替える必要がある場合は、いつでも ControlTemplates とコントロールの Binding for Template プロパティの使用を検討できます...

{Binding Converter={StaticResource YourAwesomeTemplateSwitcherConverter}}

HTH

于 2008-11-26T10:40:40.307 に答える