2010-10-13 6 views
0

Je tente de créer un contrôle personnalisé WPF qui inclut une référence au conteneur Unity qui a été créé dans le BootStrapper, par exemple.Utilisation de Unity dans les contrôles personnalisés WPF

La raison étant que je voudrais que le contrôle personnalisé soit capable de résoudre le conteneur de l'unité pour pouvoir utiliser certains des services qui ont été enregistrés dans le conteneur. par exemple. un service de préférences utilisateur/un service de droits.

Jusqu'à présent, j'ai créé mon contrôle personnalisé et inclus dans le code behind la propriété de dépendance suivante

public static readonly DependencyProperty ContainerProperty = DependencyProperty.Register("Container", typeof(UnityContainer), typeof(SomeCustomWPFControl), new PropertyMetadata("DefaultTestValue")); 

    public UnityContainer Container 
    { 
     get { return (UnityContainer)GetValue(ContainerProperty); } 
     set { SetValue(ContainerProperty, value); } 
    } 

Dans la forme WPF où je tente d'inclure mon contrôle personnalisé, j'ai ajouté la ligne suivante dans la zone Ressources:

<Unity:UnityContainer x:Key="unitContainer"></Unity:UnityContainer> 

Dans la forme, il est auto que j'ai essayé de créer le contrôle personnalisé:

<Globe:SomeCustomWPFControl Container="{DynamicResource unitContainer}" DockPanel.Dock="Right" x:Name="JimEditor1" Grid.Column="0" Grid.Row="3"></Globe:SomeCustomWPFControl> 

La seule information d'erreur que je reçois au moment de l'exécution est

Erreur à l'objet 'System.Windows.Controls.Grid' dans le fichier de balisage '[nom de montage]; [path/file] .xaml' Ligne 135 Position 22

Des suggestions sur les endroits où je me trompe? THX.

pleine Xaml:

<UserControl x:Class="DB.GPF.Globe.Views.JimTestPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:Globe="clr-namespace:DB.GPF.Globe" 
xmlns:Unity="clr-namespace:Microsoft.Practices.Unity;assembly=Microsoft.Practices.Unity"> 
<UserControl.Resources> 
    <Unity:UnityContainer x:Key="unitContainer"></Unity:UnityContainer> 
</UserControl.Resources> 
<Grid> 
    <Globe:SomeCustomWPFControl Container="{DynamicResource unitContainer}" x:Name="JImTestControl1"></Globe:SomeCustomWPFControl> 
</Grid> 

Mise à jour: Le problème semble avoir un DependencyProperty de type UnityContainer ou IUnityContainer, si le type est changé à un type .Net intégré, par exemple chaîne alors ça va bien. Des idées pour lesquelles nous ne pouvons pas avoir un DependencyProperty de type UnityContainer ou IUnityContainer?

+0

Pouvez-vous poster le reste de votre Xaml? –

+0

Voici le Xaml dans son intégralité: – Jim

+0

ajouté ci-dessus .... – Jim

Répondre

0
<Globe:SomeCustomWPFControlContainer="{DynamicResource unitContainer}" DockPanel.Dock="Right" x:Name="JimEditor1" Grid.Column="0" Grid.Row="3"></Globe:SomeCustomWPFControlContainer> 

Il y a un problème en vous XAML juste après <Globe:SomeCustomWPFControlContainer. Il vous manque une propriété à lier.

EDIT: votre valeur d'acquisition est également erronée. Vous avez GetValue (GetValue (ContextMenuProperty)) et il devrait être ...

public UnityContainer Container 
{ 
    get { return (UnityContainer)GetValue(ContainerProperty); } 
    set { SetValue(ContainerProperty, value); } 
} 
+0

Jim

+0

Merci pour les réponses rapides, vous êtes bien sûr correct, j'ai changé cela dans mon code, mais cela n'a eu aucun effet car je présume qu'il échoue avant que le getter ne soit utilisé. Je présume que l'erreur est due au fait que le contrôleur d'unité n'est pas capable de trouver mon contrôleur d'unité, mais je n'arrive pas à comprendre comment l'inclure correctement dans la zone de ressources. – Jim

1

Je pense, l'intégration dans l'unité de contrôle personnalisée est pas une bonne idée.

Si vous devez modifier certaines propriétés de votre contrôle custome que d'exposer les propriétés et les changer

+0

L'idée est que lors de la création du contrôle, il utilisera les services pour obtenir les préférences et les droits qui s'appliquent à ce contrôle. C'est à dire.s'il affiche la date au format UK/US, si l'utilisateur actuel peut ajouter ce contrôle. etc ... – Jim

+0

Ne pouvez-vous pas modifier ces propriétés sans intégrer l'unité dans votre code? Pourquoi je dis cela parce que si vous intégrez l'unité dans votre contrôle, votre contrôle dépend de l'unité et si à l'avenir, vous devez remplacer l'unité avec un autre fournisseur de DI que vous changeriez votre contrôle personnalisé, ce qui n'est pas un bon conseil , reste c'est ton code, tu peux faire ce que tu veux faire :) – TalentTuner

+1

saurabh a raison. Vous ne devez pas ajouter de conteneur à votre code. Je recommanderais toujours contre. Le conteneur doit injecter les objets et les valeurs dans votre contrôle. – RonaldV