2009-05-23 20 views
8

Bir IValueConverter uygulamalı sınıfım var ve DI kapsayıcım (Ninject) kullanarak enjekte edilmesine ihtiyacım var.XAML'ye Dönüştürücü Nasıl Eklenir

Sorun, XAML'de, Dönüştürücü nesnesinin başlatılması üzerinde denetim almanın hemen belli bir yolu yoktur. "{StaticResource ImagePathConverter Bağlama Yol = CurrentMessage, Dönüştürücü = {}}"

yerlerde, ImagePathConverter olacak =

Kaynak:

Yani benim XAML böyle bir çizgi şey içeriyor benim için yaratılmış.

Sanırım bir "hizmet bulucu" statik sınıfı oluşturabilir ve bağımlılığımı gidermek ve StaticResource özelliğini bir mülke "MyServiceLocator.TheImageConverter" olarak değiştirmek için çağırabilirim, ancak bu beni kusmak istiyor.

Bu sorunun, özellikle sağlanan kodu ve belki de bir örnek için destekleyici bir bağlantıyı hedefleyen birkaç kod parçasıyla yanıtlanabileceğini umuyorum. Sadece bir yere bir göz atmak için bir öneri.

Ayrıca, çok önemlisi, XAML kodunun koduna sahip olmadığını ve bir tane kullanamadığımı varsayalım. Bir skin derisi oluşturuyorum ve arkasında bir kod istemiyorum. Bu yüzden sınıf kurucusunda bir sınıf değişkeni ayarlayamıyorum ve referans gösteremiyorum. Belki bu mantıksız, henüz emin değilim.

+0

..? – NotDan

+0

Dönüştürücü, kendisinin bağımlılıklarına sahip olan bir formatlama sınıfında (bağımlı) kullanıldığından ve bu bağımlılıkların her birinin de bağımlılıkları olabilir. Bu, tüm bu bağımlılıkları benim için bir araya getirmek için DI'nin bütün noktasıdır. Pek çok insanın yeni nesneleri kullanmak için kullanıp kullanmadığını ve ana amacı anlamadığını merak ediyorum. – PandaWood

cevap

8

Bunun üstesinden gelmenin yaygın bir yolu, dönüştürücünüzün de MarkupExtension olması. Yani:

public class MyConverter : MarkupExtension, IValueConverter 

Sizin ProvideValue() yöntemi bu gibi kullanmak için izin böylece, dönüştürücü bir örneğini döndürebilir:

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

Bu DI ile ilgisi gerçekten değil, ama arkasındaki kodu ortadan kaldırmak için gereksiniminizi karşılar. DI konteynerinizde kayıtlı dönüştürücülere sahip olduğumu anlamıyorum.

+1

Teşekkürler, bu konvertörler hakkında adil bir endişe. DI kapsayıcısına kaydedilmiş dönüştürücülerin sahip olduğu noktaları görmemekle birlikte, DI kapsayıcısının sadece 'yeni' nesneler için kullanılıyor olduğunu varsaydığınızı düşünüyorum. Sorun, dönüştürücü sınıfının yalnızca DI kapsayıcısı tarafından çözülebilen diğer bağımlılıklara sahip olmasıdır (örn. "Tekton kapsamına kaydedilmiş" yapılandırma "nesneleri) – PandaWood

+0

Bu hatayı düzeltemediğimde bunun iyi bir yanıt olduğunu düşünüyorum ' Mapping komutunda eksik XmlNamespace, Assembly veya ClrNamespace 'Buna geri döneceğim (yani xmlns eklerken: local = "clr-namespace: MyNamespace" – PandaWood

+1

Anladım! Hata düzeltildi ve gayet güzel çalışıyor. benim servis sağlayıcımın bir modelinde ProvideValue yönteminde, ancak bunun etrafında bir yol olduğunu düşünmüyorum) – PandaWood

0

Alternatif bir yaklaşım, bağımlılığı MarkupExtension aracılığıyla gidermek ve XAML'deki dönüştürücünün özelliğine ayarlamaktır.

Ayrıntılar için aşağıdaki yanıta bakın: Sana DI ile çözülecek dönüştürücü gerekir neden bilmek ilgileniyorum

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

İlgili konular