如何将ContentPresenter与ElementHost一起使用

时间:2016-06-23 06:13:13

标签: c# wpf elementhost

我有

  • 使用Viewmodels的三个WPF UserControl
  • 一个WPF容器,用于显示其中一个WPF Usercontrols
  • WinForm Usercontrol

我想:显示不同的WPF UserControl,我设置的是WinForms用户控件

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>

结果我有这个: enter image description here

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

从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>

带有密钥的DataTemplates应该明确应用,如下所示:

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