2010-11-29 54 views
1

J'essaie d'intégrer le TabGroupPane d'Infragistics à Caliburn.Micro conformément au standard WPF TabControl.Caliburn.Micro & Infragistics XamDockManager + TabGroupPane

J'ai essayé d'ajouter une nouvelle convention dans le bootstrapper (une modification du standard WPF) mais je n'ai pas eu de succès.

Mon TabGroupPane est défini comme:

<igDock:TabGroupPane x:Name="Items"/> 

Lorsqu'un élément est ajouté à la collection une exception est levée "InvalidOperationException: Un TabGroupPane ne peut contenir que 'ContentPane' et« cas ContentPanePlaceholder".

De plus, si mon TabGroupPane se trouve dans un DockManager:

<igDock:XamDockManager> 
    <igDock:DocumentContentHost> 
     <igDock:SplitPane> 
      <igDock:TabGroupPane x:Name="Items" /> 
     </igDock:SplitPane> 
    </igDock:DocumentContentHost> 
</igDock:XamDockManager> 

Il ne semble pas être trouvé par Caliburn du tout.

Est-ce que quelqu'un d'autre l'a déjà fait?

À la votre!

Mise à jour
J'ai créé ma propre classe de gestionnaire de quai, a blog post expliquant ou tout simplement le code on bitbucket. J'espère que cela sera utile à quelqu'un!

+0

Il semble y avoir un moyen de générer des ContentPanes en utilisant le code ici: http: //blogs.infragistics .com/blogs/andrew_smith/archive/2010/01/12/itemssource-for-xamdockmanager-elements.aspx mais je ne l'ai pas encore fait fonctionner avec Caliburn. – ChrisWay

Répondre

1

Si vous ne pouvez pas obtenir le ContentPaneFactory suggéré dans le blog Infragistics pour remplir le TabGroupPane par la liaison, vous pourriez envisager ces approches alternatives:

  • garder votre machine virtuelle avec BindableCollection en place, abonnez-vous notification VM changement dans le code -behind et modifiez le TabGroupPane par programme en fonction du changement réel survenu dans la collection observée
  • créer un IResult personnalisé et l'appeler à partir de VM (en utilisant Coroutine.Execute) en fonction de la variante TabGroupPane souhaitée.
    Dans IResult.Exécutez le corps auquel vous avez accès à ActionExecutionContext.View, de sorte que vous puissiez accéder au TabGroupPane par son nom et exécuter les actions dont vous avez besoin.
    De cette façon, vous gardez votre VM libre de référence directe à la bibliothèque de contrôle de l'interface utilisateur particulière.
  • définit une interface qui extrait l'ensemble du Docking Manager et l'utilise en tant que service à partir de VM (voir this post about the implementation of a Docking Manager). Cette approche diverge beaucoup de l'idée de MVVM, mais malheureusement la plupart des bibliothèques d'amarrage ne sont pas très compatibles MVVM ...
+0

Merci Marco. Je n'ai pas encore eu l'occasion de les essayer, mais je vais le marquer comme la réponse car je suis sûr que l'on va travailler! – ChrisWay

+0

J'ai fini par créer mon propre gestionnaire de quai, j'ai mis à jour la question originale avec des liens vers le code. Merci pour l'aide! – ChrisWay

0

Avez-vous essayé d'utiliser une liaison plus explicite? Caliburn ne peut que faire une liaison automatique sur certains types d'éléments, et je suppose que Infragistics TabGroupPane n'en fait pas partie!

Je suppose que vous devez utiliser quelque chose comme ceci:

<igDock:TabGroupPane x:Name="Items" ItemSource={Binding <what to bind to>}/> 

Note: Ceci est juste utilisé comme un exemple, pas sûr si ItemSource est la propriété correcte!

+0

Merci pour la réponse. Cela contourne le problème de ne pas être trouvé à l'intérieur d'un XamDockManager, mais je dois toujours trouver un moyen d'envelopper le contenu dans un ContentPane car c'est le seul élément que vous pouvez ajouter à un TabGroupPane. – ChrisWay

1

Vous pouvez ajouter des contrôles sur mesure à la classe ConventionManager dans Caliburn Micro, je suivrais simplement l'exemple du TabGroupPanel standard. Je me méfierais de modifier la classe réelle si, si je me souviens bien (il y a un post récent sur les forums de discussion à la page CaliburnMicro Codeplex) Vous pouvez également ajouter des conventions sur mesure au bootstrapper en remplaçant la méthode Config? Je dis cela parce que si vous modifiez la classe elle-même, vous vous lierez à une version particulière de Caliburn.

C'est un cadre très simple et facile à apprendre à connaître intimement, je recommanderais de passer par le code qui est exécuté lorsque vous liez une vue à un viewmodel, là, vous apprendrez comment ces conventions sont configurées.

+0

Merci pour la réponse. J'ai jeté un coup d'oeil sur les conventions personnalisées, mais je ne suis pas sûr de savoir comment le faire fonctionner car j'ai besoin d'envelopper ce que la vue pourrait être dans un ContentPane pour le TabGroupPane à afficher. – ChrisWay