Как использовать ContentPresenter с ElementHost

у меня есть

  • три пользовательских элемента управления WPF с их моделями просмотра
  • один контейнер WPF для отображения одного из пользовательских элементов управления WPF
  • Пользовательский контроль WinForm

Я хочу: отобразить другой пользовательский элемент управления WPF, который я установил в пользовательском элементе управления 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>

В результате у меня есть это: введите здесь описание изображения

Что не так с моим кодом?


person streamdown    schedule 23.06.2016    source источник


Ответы (1)


Удалите x:Key="XYZ" из DataTemplate.
Чтобы автоматически применить 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}"  />
person igorushi    schedule 23.06.2016
comment
Спасибо за полный ответ. - person streamdown; 23.06.2016