在运行时切换数据模板 - 刷新问题

时间:2008-11-26 10:15:07

标签: c# wpf datatemplate skinning

我使用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

还有其他方法吗?

1 个答案:

答案 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