【问题标题】:Switch data templates at runtime – refresh problem运行时切换数据模板——刷新问题
【发布时间】:2008-11-26 10:15:07
【问题描述】:

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

还有其他方法吗?

【问题讨论】:

  • 为什么要删除模板?
  • @Krzysztof Skowronek 人,这个问题已有 10 年历史了。你真的希望我记住这个细节吗?
  • 对不起,我没注意到:(

标签: c# wpf datatemplate skinning


【解决方案1】:

这是因为资源在您的字典中是静态的。一旦它们被使用,它们将不会被更新。您可以尝试重新加载字典,但这只会更新新控件,而不是旧控件..

如果你希望支持多个 DataTemplates,你可以考虑 DataTemplateSelector 类,它会根据你的条件选择一个模板: http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx

如果您需要“即时”切换模板,您可以随时考虑使用 ControlTemplates 和控件的模板属性绑定...

{Binding Converter={StaticResource YourAwesomeTemplateSwitcherConverter}}

HTH

【讨论】:

  • 对我有用的临时解决方案是在视图上调用 UpdateLayout()。
猜你喜欢
  • 2021-06-22
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多