2009-05-23 47 views
8

我有一個IValueConverter實現的類,我需要使用我的DI容器(Ninject)注入它。如何在XAML中注入轉換器

問題是,在XAML中,沒有立即明顯的方式來控制Converter對象的實例化。

所以我的XAML包含一行是這樣的:

來源= 「{綁定路徑= CurrentMessage,轉換器= {StaticResource的ImagePathConverter}}」

其中,在ImagePathConverter會爲我創建。

我想我可以創建一個「服務定位器」靜態類,並調用它來解決我的依賴關係,並將StaticResource更改爲屬性「MyServiceLocator.TheImageConverter」,但這使我想嘔吐。

我希望這個問題可以用一些代碼片段來回答,這些代碼片段專門針對提供的代碼 - 也許是一個示例的支持鏈接。不只是一個建議去看看的地方。

此外,非常重要的是,假設XAML 沒有代碼隱藏 - 而且我不能使用它。我正在創建一個皮膚,並且不想要代碼。所以我不能在類的構造函數中設置一個類變量並引用它。也許這是不合理的,我還不確定。

+0

我想知道爲什麼你需要轉換器與DI解決..? – NotDan 2009-05-23 04:36:20

+0

因爲Converter使用(取決於)一個格式化類,它具有它自己的依賴關係,並且每個這些依賴關係也可能具有依賴關係。這是DI的全部重點 - 爲我連接所有這些依賴關係。 我想知道如果很多人只是用它來新的對象,並沒有意識到主要目的? – PandaWood 2009-05-23 10:45:16

回答

8

處理此問題的常見方法是讓您的轉換器也成爲MarkupExtension。那就是:

public class MyConverter : MarkupExtension, IValueConverter 

ProvideValue()方法可以返回你的轉換器的實例,從而使您可以使用它像這樣:

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

這是不是真的什麼關係DI,但它確實符合您的要求,以消除背後的代碼。我真的沒有看到轉換器註冊到您的DI容器。