2011-03-21 1 views
1

J'ai un DataTemplate c'est DataType est le MyViewModel, si je fais quelque chose comme:window.content avec DataTemplate

<ContentPresenter Content="{Binding SomeViewModel}"/> 

si je mets le « SomeViewModel » être MyViewModel (la machine virtuelle définie dans le DataTemplate) , Je peux voir le rendu DataTemplate sur la vue, ce qui est attendu.

Ce que je veux faire est la suivante:

Window host = new Window() 
host.Content = new MyViewModel(); 
host.Show(); 

je me attends à ce pour afficher une fenêtre avec le DataTemplate qui associé à la rendre MyViewModel là-dessus, au lieu que je reçois une fenêtre avec une seule ligne, le chemin à mon ViewModel.

qu'est-ce que je fais mal?

+0

Vous avez probablement un 'DataTemplate' défini au mauvais endroit. Montrez-nous une définition 'DataTemplate'. – Snowbear

Répondre

4

Probablement un problème d'emplacement de ressource. Où était le DataTemplate défini précédemment? Était-ce dans App.xaml s ResourceDictionary? Essayez d'ajouter le DataTemplate là.

<Application ...> 
    <Application.Resources> 
     <DataTemplate DataType="{x:Type MyViewModel}"> 
      <!-- View --> 
     </DataTemplate> 
    </Application.Resources> 
</Application> 

Dans un scénario mieux cas, vous placer dans une ResourceDictionary qui a fusionné avec d'autres App.xaml.

Édition: petit exemple de travail.

<Application x:Class="DataTemplateTest.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     Startup="Application_Startup"> 
    <Application.Resources> 
     <DataTemplate DataType="{x:Type sys:Int32}"> 
      <Border Background="Red"> 
       <TextBlock Text="{Binding}" /> 
      </Border> 
     </DataTemplate> 
    </Application.Resources> 
</Application> 

approprié code-behind:

public partial class App : Application 
{ 
    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     var window = new Window(); 
     window.Content = 42; 
     window.Show(); 
    } 
} 

Edit 2: Puisque vous avez dit ce code est dans un WPF AddIn

  1. Si le DataTemplate est dans l'application hôte, cela ne fonctionnera pas. Les interfaces utilisateur Host et AddIn ne se parlent pas de cette manière car l'AddIn est simplement HwndSource.
  2. Si le DataTemplate est dans un ResourceDictionary dans le AddIn, vous pouvez le charger comme ceci:

    var window = new Window(); 
    window.Resources.MergedDictionaries.Add(
        new ResourceDictionary 
        { 
         Source = 
          new Uri("pack://application:,,,/AddInAssembly;component/Resources.xaml", 
            UriKind.Relative) 
        }); 
    window.Content = ...; 
    window.Show(); 
    
+0

@sixlettervariables, ne semble pas, parce que dans le cas de ContentPresenter cela fonctionne – Pacman

+1

J'utilise cette approche assez souvent pour savoir que cela fonctionne, peut-être que vous pouvez poster plus de code? Mon instinct dit que la ressource 'DataTemplate' n'est pas dans un' ResourceDictionary' que 'Window' peut trouver. – user7116

+0

Je n'ai pas app.xaml, cela fait partie d'un AddIn, Application.Current retourne null. aussi, comme je l'ai mentionné, mon ContentPresenter se lie à la même machine virtuelle que j'essaie de montrer dans le Window.Content, avec succès, mais quand j'utilise la même propriété pour le lancer en tant que partie de la window.Content échoue. – Pacman

0

vous devez ajouter les informations suivantes à votre question: où est défini le DataTemplate/usercontrol (addin.dll)? où est "window" défini (mainproject)? Si votre viewmodel et datatemplate sont dans votre addin.dll et que votre "fenêtre" est dans votre mainproject, vous devrez au moins ajouter votre datatemplate en tant que ressource dans la fenêtre. Si votre viewmodel et datatemplate et votre "fenêtre" sont dans votre addin.dll et que vous appelez simplement dans votre projet principal "window.show" alors vous devez ajouter le datatemplate comme une ressource à la "fenêtre" dans votre addin.dll.

i utiliser mef fo construction WPF applications plugin et j'utiliser la syntaxe suivante dans mes addin.dlls:

<ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/YourAddinDllName;Component/ResourceDictionary.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 

BTW si vous exposez simplement votre viewmodel et appelez dans votre MainProject. vous devez exposer et enregistrer votre datatemplate aussi.laissez-moi savoir comment fonctionnent vos plugins.

Questions connexes