切换到相同DataType的对象后,DataTemplate不刷新 [英] DataTemplate does not refresh after switching to an object of same DataType
问题描述
我有以下 ControlTemplate
:
<ContentControl Content="{Binding ContentViewModel}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type viewModel:FilledContentViewModel}">
<usercontrols:FilledMainWindow x:Name="MainContent" />
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:EmptyContentViewModel}">
<!-- todo: Something like a StartPage here -->
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
这很好用,直到视图模型尝试将 ContentViewModel
属性从一个 FilledContentViewModel
更改为新的 FilledContentViewModel
,然后将其内容 ContentControl
不刷新.如果从 EmptyContentViewModel
切换到 FilledContentViewModel
或以其他方式进行切换,则可以正常工作.
This works great until the view model tries to change the ContentViewModel
property from one FilledContentViewModel
to a new FilledContentViewModel
, then the content of the ContentControl
does not refresh.
If switching from EmptyContentViewModel
to FilledContentViewModel
or the other way around, it works.
当然,仅更新现有 FilledContentViewModel
中的所有内容都是一种解决方案.但是我认为这可能很快就会变得混乱,仅创建具有正确上下文的新 ViewModel
并进行切换会更加优雅.
Of course, just updating everything in the existing FilledContentViewModel
instead would be one solution. But I think it could get messy quick and that just creating a new ViewModel
with the right context and switch it would be more elegant.
有人知道一种让 DataTemplate
的内容刷新的方法吗?
Does anybody know a way to let the content of the DataTemplate
refresh?
推荐答案
我遇到了与 ContentPresenter
控件类似的问题,在该控件中,我会将 Content
切换为具有相同视图模型类型的新实例,并且没有刷新.我发现在social.msdn.microsoft.com上遇到了几乎相同的问题,最终使用的解决方案是创建自定义的 ContentControl
/ ContentPresenter
作为social.msdn.microsoft.com答案的一部分:
I ran into a similar problem with the ContentPresenter
control where I would switch the Content
to be a new instance of the same view model type and it wasn't refreshing. I found nearly the identical problem I was running into on social.msdn.microsoft.com and the solution I ended up using was to create a custom ContentControl
/ ContentPresenter
that was posted as part of the social.msdn.microsoft.com answer: