2009-12-21 18 views
5

Tengo un control personalizado que tiene DependencyProperty MyAnimal - Estoy vinculando una propiedad de animal en mi ViewModel a MyAnimal DependencyProperty.wpf ¿cómo saber cuándo ha finalizado el enlace de datos?

He pegado un TextBox en el Control para poder desencadenar un evento; cada vez que desencadenar el evento se ha establecido la propiedad MyAnimal; sin embargo, si pongo un punto de interrupción en el Setter de la propiedad MyAnimal, nunca se dispara !

Supongo que me falta algo fundamental sobre WPF Dependency Properties/Binding ?!

Y entonces mi pregunta es, si no puedo usar el Setter, ¿cómo puedo saber cuándo se ha configurado? Si pongo si pongo un punto de ruptura después de InitializeComponent(), es nulo y eché un vistazo para ver si hay un Evento en el que se puede conectar hasta - ¿Terminó DatabindingFinished o similar? pero no puede ver lo que sería ...

¿Alguien puede ayudarme por favor?

Gracias,

Andy

public partial class ControlStrip 
{ 
    public ControlStrip() 
    { 
     InitializeComponent(); 
    } 

    public Animal MyAnimal 
    { 
     get 
     { 
      return (Animal)GetValue(MyAnimalProperty); 
     } 
     set 
     { 
      SetValue(MyAnimalProperty, value); 
     } 
    } 

    public static readonly DependencyProperty MyAnimalProperty = 
     DependencyProperty.RegisterAttached("MyAnimal", typeof (Animal), typeof (ControlStrip)); 

    private void TextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e) 
    { 
     var myAnimal = MyAnimal; 
     MessageBox.Show(myAnimal.Name); 
    } 

} 
+1

Una pregunta - ¿Por qué utiliza RegisterAttached y no se registra? No parece que esto deba ser una propiedad adjunta, sino más bien un DP normal ... –

+0

ese es un muy buen punto, ¡aplausos - copie y pegue! –

Respuesta

5

El sistema de ejecución nunca llama al método setter. Van directamente a DependencyProperty. Deberá agregar un argumento adicional a su llamada a RegisterAttached(). Allí puede agregar un PropertyChangedCallback.

Aquí hay un código de ejemplo:

public static readonly DependencyProperty MyAnimalProperty = 
    DependencyProperty.RegisterAttached("MyAnimal", typeof (Animal), typeof (ControlStrip), new PropertyMetadata(AnimalChanged)); 

private static void AnimalChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
{ 
    // Do work here 
} 
4

El colocador sólo está allí para su uso - en realidad se pueden dejar fuera de la propiedad en su totalidad, ya que DataBinding utiliza la propiedad de dependencia en sí, no la propiedad CLR.

Si necesita ver cuándo cambia la propiedad, deberá especificar PropertyMetadata en su propiedad de dependencia y proporcionar un PropertyChangedCallback.

Para más detalles, recomiendo leer Dependency Property Metadata.

Cuestiones relacionadas