2009-05-23 17 views
8

私はIValueConverterの実装クラスを持っています。私はそれをDIコンテナ(Ninject)を使って注入する必要があります。XAMLにコンバータを挿入する方法

XAMLでは、Converterオブジェクトのインスタンス化を制御することはすぐにはわかりません。

だから私のXAMLは、このような行に何か含まれています

ソース= "{バインディングパス= CurrentMessage、コンバーター= {StaticResource ImagePathConverter}}"

ImagePathConverter意志を私のために作成される。

"サービスロケータ"静的クラスを作成してそれを呼び出すと、依存関係を解決し、StaticResourceをプロパティ "MyServiceLocator.TheImageConverter"に変更することができますが、それは私に嘔吐したいものです。

この質問には、提供されたコードを具体的にターゲットとしたコードスニペットをいくつか回答してほしいと思っています。どこかで見てみることを推奨するだけではありません。

また、非常に重要なことは、XAML にはコードビハインドがなく、私は使用できないと仮定します。私はスキンを作成しているので、コードが欲しくない。クラスのコンストラクタでクラス変数を設定して参照することはできません。たぶんそれは不合理だ、私はまだわからない。

+0

私はあなたがコンバータはDIで解決する必要がある理由を知って興味がありますか..? – NotDan

+0

Converterは、依存関係のある書式設定クラスを使用する(依存する)ため、依存関係のそれぞれにも依存関係が存在する可能性があります。これはDIの全体のポイントです - これらの依存関係を私のために結びつけることです。 多くの人が新しいオブジェクトに使っているだけで、主な目的が分からないのだろうか? – PandaWood

答えて

8

これを処理する一般的な方法は、コンバータがMarkupExtensionでもあることです。それは次のとおりです。

public class MyConverter : MarkupExtension, IValueConverter 

あなたProvideValue()方法は、あなたがこのようにそれを使用することができので、あなたのコンバータのインスタンスを返すことができます。

Source="{Binding CurrentMessage, Converter={local:MyConverter SomeParameterToConverter}}" 

これは、DIとは何が本当にありませんが、それコードを排除するという要件に対応しています。私はあなたのDIコンテナに登録されているコンバーターを持っているという点は本当に分かりません。

+1

ありがとう、それはコンバータについてはかなり心配です。 DIコンテナに登録されているコンバーターのポイントが見えないので、DIコンテナが「新規アップ」オブジェクトに使用されていると仮定していると思います。 問題のConverterクラスにはDIコンテナでしか解決できない他の依存関係があります(シングルトンスコープに登録された "構成"オブジェクトなど) – PandaWood

+0

これは良い答えだと思います。 「xmlns:local = "clr-namespace:MyNamespace"を追加したにもかかわらず、XmlNamespace、Assembly、またはClrNamespaceが見つからない」というメッセージが返されます。 – PandaWood

+1

エラーが修正され、うまく機能します。私のDIはProvideValueメソッドのサービスロケータファッションではありますが、その周りには何の方法もないと思います) – PandaWood

0

代替アプローチは、MarkupExtensionを介して依存関係を解決し、それをXAMLのコンバータのプロパティに設定することです。

詳細については、以下の回答を参照してください:

https://stackoverflow.com/a/41611854/2115905

関連する問題