我有以下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
to FilledContentViewModel
或者相反,它有效。
当然,只需更新现有的所有内容FilledContentViewModel
相反,这将是一种解决方案。但我认为它可能会很快变得混乱并且只是创建一个新的ViewModel
有了正确的上下文和开关,它会更加优雅。
有谁知道如何让内容DataTemplate
刷新?
我遇到了类似的问题ContentPresenter
控制我要切换的位置Content
成为相同视图模型类型的新实例,并且它并不令人耳目一新。我发现我在 Social.msdn.microsoft.com 上遇到的问题几乎相同,我最终使用的解决方案是创建一个自定义ContentControl
/ ContentPresenter
这是作为 Social.msdn.microsoft.com 答案的一部分发布的:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/6bc0a0ed-cb98-4863-a09e-5c99d0ddf90e/mvvm-contentcontrols-view-will-not-refresh?forum=wpf https://social.msdn.microsoft.com/Forums/vstudio/en-US/6bc0a0ed-cb98-4863-a09e-5c99d0ddf90e/mvvm-contentcontrols-view-will-not-refresh?forum=wpf
public class MyContentControl : ContentControl
{
public MyContentControl()
{
this.ContentTemplateSelector = new MyDataTemplateSelector();
}
class MyDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var declaredDataTemplate = FindDeclaredDataTemplate(item, container);
var wrappedDataTemplate = WrapDataTemplate(declaredDataTemplate);
return wrappedDataTemplate;
}
private static DataTemplate WrapDataTemplate(DataTemplate declaredDataTemplate)
{
var frameworkElementFactory = new FrameworkElementFactory(typeof(ContentPresenter));
frameworkElementFactory.SetValue(ContentPresenter.ContentTemplateProperty, declaredDataTemplate);
var dataTemplate = new DataTemplate();
dataTemplate.VisualTree = frameworkElementFactory;
return dataTemplate;
}
private static DataTemplate FindDeclaredDataTemplate(object item, DependencyObject container)
{
var dataTemplateKey = new DataTemplateKey(item.GetType());
var dataTemplate = ((FrameworkElement)container).FindResource(dataTemplateKey) as DataTemplate;
if (dataTemplate == null)
throw new Exception("datatemplate not found");
return dataTemplate;
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)