2011-04-19 16 views
5

Ekli özelliklerin bir nesneye uygulandığı sıra nedir? Sanırım bunu görmezden gelmeliyim, ama burada benim senaryo: VM'yi View'a yapıştıran bir özelliğe ve daha sonra birincisine bağlı olan bir başka iliştirilmiş eşyaya sahibim. Ikincisi ilk önce kurulursa ne olduğunu görmeye çalışıyorum, ama hatayı almayı başaramıyorum! yani ilk (model) her zaman, xaml'deki sıra ne olursa olsun, ikinci saniyeden önce kurulur. Kim atama emrini veriyor? Onu değiştirebilir miyim? Eklenen özellikler Sipariş

Şimdi mülkü değişim etkinliğini abone olarak geç assigmement uğraşıyorum:
DependencyPropertyDescriptor dd = DependencyPropertyDescriptor.FromProperty(FrameworkElement.DataContextProperty,depo.GetType()); 
      dd.AddValueChanged(depo, (s, a) => 
      { 
       ChangeDatacontext(s as DependencyObject); 
      } 

simülasyonunu elle Sorun kurulum nesnesine yeni datacontext için

. Diğer önce ayarlanmış olan mülkiyet güvenmek çünkü hiçbir zaman

sayesinde Felix

cevap

2

doğrudan bu soruya cevap veremez, ancak her ikisi de ekli özellikleri kullanmak bir yöntemle halledebiliriz. böylece aslında iki değiştirilen işleyicileri var ve diğer özelliğinin null olması durumunda gördüğü için son mantığını yürütür tetikler hangisi

public static readonly DependencyProperty RuleVMProperty = 
     DependencyProperty.RegisterAttached("RuleVM", typeof(DocumentRuleViewModel), typeof(DocumentRuleViewModel), new UIPropertyMetadata(null, RuleVMChanged)); 

    public static void RuleVMChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) 
    { 
     var el = GetRefid(sender); 
     var vm = args.NewValue as DocumentRuleViewModel; 
     if(vm==null) 
      return; 
     vm.SetDocumentFromRefid(sender, el); 
    } 

    public static readonly DependencyProperty RefidProperty = 
     DependencyProperty.RegisterAttached("Refid", typeof(XmlElement), typeof(DocumentRuleViewModel), new UIPropertyMetadata(RefidChanged)); 

    public static void RefidChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) 
    { 
     var el = args.NewValue as XmlElement; 
     var vm = GetRuleVM(sender); 
     if (vm == null) 
      return; 
     vm.SetDocumentFromRefid(sender, el); 
    } 

    private void SetDocumentFromRefid(DependencyObject sender, XmlElement element) 
    { 
     ... // this is where the actual logic sits 
    } 

: Burada

benim şimdiki koddan bir örnektir.

+1

işte teşekkürler. Ama ya iki farklı nesneyiniz varsa? Şimdi nesne üzerinde PropertyChange olayına abone oluyorum ve bu benim için çalıştı, ama sadece bir proeprty her zaman diğerinden önce neden olduğunu merak ediyorum. –