2016-06-23 1 views
1

JeComment utiliser ContentPresenter avec ElementHost

  • trois UserControls WPF avec leurs ViewModels
  • un conteneur WPF pour afficher l'un des WPF usercontrols
  • WinForm Usercontrol

Je veux: affichage de WPF UserControl différent, que j'ai défini dans 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> 

En conséquence, j'ai ceci: enter image description here

Quel est le problème avec mon code?

Répondre

1

Supprimez x:Key="XYZ" de DataTemplate.
Pour appliquer un DataTemplate automatiquement à DataType, vous devez omettre la clé.
Par exemple:

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

Ce XAML équivaut à:

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

DataTemplates avec une clé doit être explicitement appliquée comme ceci:

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

Merci pour la réponse complète. – streamdown