2009-03-05 27 views
8

DependencyObject ve DependencyProperty tarafından kullanılan Miras Ağacı (veya Devralma Bağlamı) özelliği hakkında yeterli bilgileri bulmaya çalışıyorum.DependencyObject Kalıtım Ağacı'nı Özelleştirme

Tipik bir WPF sayfasının dışına DependencyProperty dışa aktarma özelliği değerini kullanmak istiyorum, böylece A nesnesi mantıksal üst nesne B'dir ve böylece A nesnesindeki bir özelliğe atanan değer otomatik olarak B nesnesine doğru ilerler. yerel olarak ayarlanmadıkça (FlowDirection özelliğinin WPF'de çalışması gibi).

Nesne A ve Nesne B DependencyObject den derieved ise

ve değil çocuklardır bir UIElement Mantıksal ağaç kurmak nasıl ardından, (diğer bir deyişle, nesne A, kendi kökü olan) DependencyProperty böylece B'nin A'nın çocuğu olduğunu biliyor mu?

Hillberg Freezable Trick ve Josh Smith's bag of tricks, tam aradığım şey değil. I , mevcut bir eleman ağacından özellikleri almak istemiyor ... Kendi görsel olmayan eleman ağacımı oluşturmak istiyorum ... yani, miras bağlamında kontrol sahibi olmak istiyorum.

Bu bilgi gövdesinin nerede saklandığını bilen var mı?

+1

Sorununuzu nasıl çözdüğünüzü merak ediyorum. Kendi ağacınızı/mirasınızı/DP mekanizmanızı mı yazdınız? Yolunda size yardımcı olacak herhangi bir kütüphane buldunuz mu? Benzer bir şey yapmaya çalışıyorum. –

cevap

10

DependencyObject için kaynak koduna göz sersemleyici çok araştırmadan sonra ve burada kısa cevabı:

InheritenceContext (bir örneği mantıksal ebeveyn ortaya mülkiyet) (olduğu DependencyObject yararlı uygulamasının% 90 gibi) iç olarak işaretlenmiş ve böylece WindowsBase.dll

dışındaki tüm kodlardan gizlenmiş tutulur. _contextParent alanını ayarlamak için yansıma kullanmak ve InheritenceContext ayarlamak için bu gizli yöntemleri çağırmak mümkündür, ancak sonunda gün onun temiz bir çözüm değil.

DependencyObject kaynak kodunu inceledikten sonra, etkilenmediğimi söylemeliyim. DependencyObject çok temiz, her yerde kullanılabilen, yeniden kullanılabilir bir sınıf olabilir ve olmalıydı. Bunun yerine, yapısal ve davranışsal olarak onun mirasçılarına bağlıdır ve Freezable'ın alt sınıfların geri kalanıyla birlikte var olmasına yardımcı olmak için belirli sabitleri, alanları, yöntemleri ve çalışma çevrelerini içerir, bu da yalnızca iyi OO tasarımından uzaktır. ama aynı zamanda WPF çerçevesinin dışında kesinlikle kullanılamaz bir sınıf oluşturur.

+1

Bu ilginç sorunun cevabını alkışlıyor. Dil/derleyici desteğinin (Freezable için aynı) daha iyi bir utangaç olduğunu düşünmemekle birlikte, bu tür özelliklerin belirli bir temel sınıf gerektirmesi bir utançtır. –

+0

Gittiğiniz çözümü paylaşabilir misiniz? Kendi "DependencyObject" uygulamanızı yaptınız mı? – Nock

0

Değerlerin kendiliğinden geçersiz kılmadığı çocuklara değerlerin yayılmasını soruyorsunuzdur.

Çocuk sahibi olan bir WPF öğesi kavramı, bildiğim kadarıyla ContentControl tarafından tanıtılmaktadır. Bu, hiyerarşiden aşağı gitmek istediğinizden çok daha fazla devreye giriyor. Yani, eğer bu davranışın tezahür etmeyeceği konusunda sadece DependencyObject'dan türemiş olsaydınız varsayım. Özellikle, bir çocuğun belirli bir mülk için bir değeri yoksa, ebeveynine sormasını bilmesi gerekir.

İlginç bir soru. Tam cevabı da bilmek isterim.