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

发布于 2024-07-08 19:30:29 字数 642 浏览 7 评论 0原文

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

还有其他方法吗?

I use MVVM architecture to decouple my application. That is, you often see something like

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

The UI is defined via data templates that reside in resource dictionaries in their own XAML files

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

I load the resources at application startup and the application is happy to display my UI. But if I remove a data template and add a new one (same key, same data type) the UI still uses the old data template. Of course I can re-set the content of my container to force a refresh but this seems goofy because I have to notify every control about a change, like this

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

Any other approaches?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

乜一 2024-07-15 19:30:29

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

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

如果您需要“动态”切换模板,您始终可以考虑使用 ControlTemplates 和控件的 Binding for Template 属性...

{Binding Converter={StaticResource YourAwesomeTemplateSwitcherConverter}}

HTH

This is because the resources are static in your dictionary. Once they have been used, they will not be updated. You could try to reload the dictionaries, but that will only update new controls, not the old ones..

If you wish to support multiple DataTemplates, you can consider the DataTemplateSelector class, which will select a template according to your conditions:
http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx

If you need to switch templates 'on the fly', you can always consider using ControlTemplates and a Binding for Template property of your control...

{Binding Converter={StaticResource YourAwesomeTemplateSwitcherConverter}}

HTH

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文