2011-04-19 11 views
5

¿Cuál es el orden en que se aplican las propiedades adjuntas a un objeto? Supongo que debería ignorar esto, pero aquí mi escenario: Tengo una propiedad adjunta para pegar la VM a la Vista, y luego, otra propiedad adjunta que depende de la primera. Estoy tratando de ver qué pasa si el segundo está configurado antes del primero, ¡pero no logro obtener el error! es decir, el primero (el modelo) siempre se configura antes del segundo, cualquiera que sea el orden en xaml. ¿Quién dirige la orden de asignación? ¿Puedo cambiarlo?Propiedades adjuntas pedido

Ahora estoy tratando con el fallecido assigmement mediante la suscripción al evento de cambio de proeprty:

DependencyPropertyDescriptor dd = DependencyPropertyDescriptor.FromProperty(FrameworkElement.DataContextProperty,depo.GetType()); 
      dd.AddValueChanged(depo, (s, a) => 
      { 
       ChangeDatacontext(s as DependencyObject); 
      } 

y para simular la configuración I problema manualmente un nuevo DataContext al objeto.

Gracias, Félix

Respuesta

2

no pueden responder directamente a esta pregunta, porque nunca me baso en el que la propiedad se establece antes que el otro, pero se puede manejar las cosas con un método que utilizan las propiedades adjuntas.

aquí es un ejemplo de mi código actual:

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 
    } 

lo que en esencia tiene dos controladores modificados y lo que desencadena la última ejecuta la lógica ya que considera que si la otra propiedad es nula.

+1

eso es trabajo gracias. Pero, ¿y si tienes dos objetos diferentes? Ahora estoy suscribiendo el evento PropertyChange en el objeto, y funcionó para mí, pero tengo curiosidad sobre por qué una empresa siempre se establece antes que la otra. –