在运行时切换数据模板 刷新问题
我使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是因为资源在您的字典中是静态的。 一旦使用,就不会更新。 您可以尝试重新加载字典,但这只会更新新控件,而不会更新旧控件。
如果您希望支持多个 DataTemplate,您可以考虑 DataTemplateSelector 类,它将根据您的条件选择一个模板:
http://msdn.microsoft.com/en- us/library/system.windows.controls.datatemplateselector.aspx
如果您需要“动态”切换模板,您始终可以考虑使用 ControlTemplates 和控件的 Binding for Template 属性...
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...
HTH