Ich habe eine IValueConverter implementiert Klasse und ich muss es mit meinem DI-Container (Ninject) injiziert werden.
Das Problem ist, dass es in XAML keinen unmittelbar offensichtlichen Weg gibt, Kontrolle über die Instantiierung des Converter-Objekts zu bekommen.
Also mein XAML enthält eine Zeile in etwa so:
Quelle="{Binding Path = CurrentMessage, Converter = {StaticResource ImagePathConverter}}"
Wo der ImagePathConverter für mich erstellt wird.
Ich nehme an, ich könnte eine statische Klasse "Service Locator" erstellen und sie aufrufen, um meine Abhängigkeit aufzulösen und die StaticResource in eine Eigenschaft "MyServiceLocator.TheImageConverter" zu ändern, aber das bringt mich dazu, zu erbrechen.
Ich hoffe, dass diese Frage mit einigen Codeschnipsel beantwortet werden kann, die speziell auf den bereitgestellten Code abzielen - und vielleicht einen unterstützenden Link zu einem Beispiel. Nicht einfach eine Empfehlung, irgendwo hinzuschauen.
Nehmen Sie außerdem sehr wichtig an, dass XAML keinen Code-behind hat - und dass ich keinen verwenden kann. Ich erstelle eine Haut und möchte keinen Code hinter mir haben. Also kann ich keine Klassenvariable im Klassenkonstruktor setzen und darauf verweisen. Vielleicht ist das unvernünftig, da bin ich mir noch nicht sicher.
Ein gängiger Weg ist, dass Ihr Konverter auch ein MarkupExtension
ist. Das ist:
Ihre ProvideValue()
-Methode kann eine Instanz Ihres Konverters zurückgeben, so dass Sie sie wie folgt verwenden können:
Dies ist nicht wirklich etwas mit DI zu tun, aber es erfüllt Ihre Anforderung, den Code dahinter zu beseitigen. Ich sehe nicht wirklich den Sinn, dass Konverter in Ihrem DI-Container registriert sind.
Tags und Links wpf dependency-injection xaml