如何将 ContentPresenter 与 ElementHost 一起使用

How to use ContentPresenter with ElementHost

我有

我要:显示不同的WPF UserControl,我在WinForms User Control中设置

public partial class WinContainer : UserControl
    {
        public WinContainer()
        {
            InitializeComponent();
            WPFContainer WPFControl = new WPFContainer();
            PartPageViewModel ss = new PartPageViewModel();
            WPFControl.DataContext = ss;
            ElementHost elHost = new ElementHost();
           elHost.Child = WPFControl;
            elHost.Dock = DockStyle.Fill;
            this.Controls.Add(elHost);
        }
    }
<UserControl x:Class="MDMSpecification.Views.WPFContainer"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:MDMSpecification.Views"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:services="clr-namespace:MDMSpecification.Services"
             xmlns:viewModels="clr-namespace:MDMSpecification.ViewModels"
             d:DesignHeight="300"
             d:DesignWidth="300"
             mc:Ignorable="d">
    <UserControl.Resources>
        <DataTemplate x:Key="Assembly" DataType="{x:Type viewModels:AssemblyPageViewModel}">
            <local:AssemblyPageView />
        </DataTemplate>
        <DataTemplate x:Key="Part" DataType="{x:Type viewModels:PartPageViewModel}">
            <local:PartPageView />
        </DataTemplate>
        <DataTemplate x:Key="Drawing" DataType="{x:Type viewModels:DrawingPageViewModel}">
            <local:DrawingPageView />
        </DataTemplate>
    </UserControl.Resources>
    <StackPanel>
        <ContentPresenter   Content="{Binding}"  />
    </StackPanel>
</UserControl>

结果我有这个:

我的代码有什么问题?

从 DataTemplate 中删除 x:Key="XYZ"
为了将 DataTemplate 自动应用于 DataType,您应该省略键。
例如:

<DataTemplate DataType="{x:Type viewModels:AssemblyPageViewModel}">
     <local:AssemblyPageView />
</DataTemplate>

这个xaml相当于:

<DataTemplate x:Key={x:Type viewModels:AssemblyPageViewModel} 
              DataType="{x:Type viewModels:AssemblyPageViewModel}">
    <local:AssemblyPageView />
</DataTemplate>

带键的数据模板应像这样显式应用:

<ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource Assembly}"  />