我使用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
还有其他方法吗?
答案 0 :(得分:4)
这是因为资源在字典中是静态的。一旦使用它们,它们将不会更新。您可以尝试重新加载字典,但这只会更新新控件,而不是旧控件。
如果您希望支持多个DataTemplates,可以考虑使用DataTemplateSelector类,它将根据您的条件选择模板: http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx
如果您需要“动态”切换模板,您可以随时考虑使用ControlTemplates和控件的Binding for Template属性......
{Binding Converter={StaticResource YourAwesomeTemplateSwitcherConverter}}
HTH