2009-07-19 7 views
0

J'ai un code XAML qui doit charger mon UserControl à l'intérieur du TabControl.XAML ne charge pas UserControl à partir de l'objet ViewModel

Si je mets ce code XAML:

<DataTemplate x:Key="WorkspacesTemplate"> 
    <TabControl 
    IsSynchronizedWithCurrentItem="True" 
    ItemsSource="{Binding Path=Gui}" 
    ItemTemplate="{StaticResource ClosableTabItemTemplate}" 
    Margin="4" 
    /> 
</DataTemplate> 

Je ne absolutly apparaissent dans les fenêtres (propriété IUG est dans la classe ViewModel et retourner un UserControl).

Mais si je mets son code XAML au lieu de la précédente:

<DataTemplate x:Key="WorkspacesTemplate"> 
    <TabControl 
    IsSynchronizedWithCurrentItem="True" 
    ItemsSource="{Binding}" 
    ItemTemplate="{StaticResource ClosableTabItemTemplate}" 
    Margin="4" 
    /> 
</DataTemplate> 

Je le chargement d'objets ViewModel:

alt text http://clip2net.com/clip/m12122/1248018108-clip-3kb.png

Voici un morceau de code de la TextBoxInputViewModel que a la propriété Gui qui devrait être liée pour pouvoir obtenir le Visual (usercontrol):

private UserControl gui; 

    public UserControl Gui 
    { 
     get 
     { 
      if (this.gui == null) 
      { 
       this.gui = new SimpleTextBoxInputControl();//Xaml User Control 
       this.gui.DataContext = this;//Bind the Visual and ViewModel 
      } 
      return this.gui; 
     } 
    } 

Une idée de comment je peux obtenir le UserControl au lieu de ce texte de référence d'objet?

+0

essayez-vous de regarder dans la fenêtre de sortie dans le cas de ItemsSource = "{Binding Path = Gui}"? fenêtre de sortie affiche des erreurs de liaison, le message devrait aider –

+0

Merci de me notez sur les fenêtres de sortie. Je vois "System.Windows.Data Erreur: 32: ObjectDataProvider a besoin d'un objet ObjectType ou ObjectInstance." Mais ne peut pas voir si c'est lié à cette liaison ou non. –

+0

Je ne pense pas que c'est lié à cette cause de liaison si je mets la liaison à elle-même, il a toujours cette erreur. –

Répondre

2

Le problème est que ItemSource est une collection, dans laquelle vous liez une propriété qui n'est qu'une valeur. L'erreur dans la fenêtre Sortie que vous voyez est probablement liée à cela. Au lieu de renvoyer un code UserControl directement à partir de votre modèle, il est préférable de renvoyer un autre modèle qui représente le contenu de l'onglet et d'utiliser des modèles pour afficher ce contenu. Si vous avez besoin d'être plus dynamique que de choisir le modèle basé sur le Type du modèle de vue, regardez dans le paramètre TabControl.ContentTemplateSelector. Cela doit être défini sur une classe dérivée de DataTemplateSelector. Vous pouvez utiliser cette classe pour décider quel modèle charger en fonction de l'objet lié à cet onglet.

+0

Très bien, ce soir, à mon retour du travail, je vais enquêter de votre point de vue. Je vous ferai savoir si cela fonctionne ou non. –

+0

Merci beaucoup, c'est si évident quand vous le savez. En fait, vous m'éclairez avec la collection. J'avais tellement tort, mais au lieu d'utiliser DataTemplateSelector, j'ai simplement utilisé ContentTemplate à l'intérieur du TabControl et dans le template j'ai lié au Path = Gui et ça a marché! Merci! –

1

vous devez créer un modèle pour votre viewmodel dans votre fichier app.xaml comme celui-ci

<DataTemplate DataType="{x:Type simpleModel:TextBoxInputViewModel}"> 
     <myView:TextBoxInputControl /> 
    </DataTemplate> 

où simpleModel est l'espace de noms TextBoxInputViewModel et TextBoxInputControl est le contrôle de l'utilisateur que vous souhaitez afficher et myView est l'espace de noms de ce contrôle utilisateur.

+0

D'accord mais le TextBoxInputViewModel peut être un autre contrôle, c'est dynamique c'est pourquoi je ne peux pas l'écrire directement dans le Xaml. –

Questions connexes