切换到相同数据类型的对象后,DataTemplate 不刷新

Dim*_*ima 6 c# wpf xaml datatemplate contentcontrol

我有以下内容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>
Run Code Online (Sandbox Code Playgroud)

这非常有效,直到视图模型尝试将ContentViewModel属性从 1更改FilledContentViewModel为新的FilledContentViewModel,然后 的内容ContentControl不会刷新。如果从EmptyContentViewModelFilledContentViewModel或相反的方式切换,它就会起作用。

当然,仅更新现有的所有内容FilledContentViewModel也是一种解决方案。但我认为它可能会很快变得混乱,而只需使用ViewModel正确的上下文创建一个新的并切换它会更优雅。

有谁知道有什么方法可以让内容刷新DataTemplate吗?

Col*_*e W 1

我在控件中遇到了类似的问题,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

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)