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 Converter={StaticResource YourAwesomeTemplateSwitcherConverter}}

高温高压

于 2008-11-26T10:40:40.307 回答