2010-12-06 21 views
7

tengo una costumbre propiedades de dependencia se define así:WPF propiedades de dependencia que no trabaja

public static readonly DependencyProperty MyDependencyProperty = 
DependencyProperty.Register(
"MyCustomProperty", typeof(string), typeof(MyClass)); 

    private string _myProperty; 
    public string MyCustomProperty 
    { 
     get { return (string)GetValue(MyDependencyProperty); } 
     set 
     { 
      SetValue(MyDependencyProperty, value); 
     } 
    } 

Ahora trato establece esa propiedad en XAML

<controls:TargetCatalogControl MyCustomProperty="Boo" /> 

Pero el colocador en DependencyObject no recibe un golpe! Aunque lo hago cuando cambio la propiedad para que sea una propiedad regular y no una Dep Pro

Respuesta

15

Prueba esto ..

public string MyCustomProperty 
    { 
     get 
     { 
      return (string)GetValue(MyCustomPropertyProperty); 
     } 
     set 
     { 
      SetValue(MyCustomPropertyProperty, value); 
     } 
    } 

    // Using a DependencyProperty as the backing store for MyCustomProperty. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty MyCustomPropertyProperty = 
     DependencyProperty.Register("MyCustomProperty", typeof(string), typeof(TargetCatalogControl), new UIPropertyMetadata(MyPropertyChangedHandler)); 


    public static void MyPropertyChangedHandler(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     // Get instance of current control from sender 
     // and property value from e.NewValue 

     // Set public property on TaregtCatalogControl, e.g. 
     ((TargetCatalogControl)sender).LabelText = e.NewValue.ToString(); 
    } 

    // Example public property of control 
    public string LabelText 
    { 
     get { return label1.Content.ToString(); } 
     set { label1.Content = value; } 
    } 
+0

Perfecto, gracias – Bob

+0

¿No se supone que funciona con solo 'nuevos UIPropertyMetadata (0)'? Tengo el mismo problema. ¿Cuál es el motivo para implementar la asignación manual? – Den

+0

@Den Tengo la misma pregunta. Parece tonto tener que crear una propiedad convencional y de dependencia para cada elemento en el control – Killnine

2

No, a menos que la llame de forma manual. Hay un controlador modificado por la propiedad que puede agregar a la llamada del constructor DependancyProperty para que se le avise cuando cambie la propiedad.

Llame a este constructor:

http://msdn.microsoft.com/en-us/library/ms597502.aspx

Con una instancia PropertyMetadata creado por este constructor:

http://msdn.microsoft.com/en-us/library/ms557327.aspx

EDIT: Además, no se está implementando la propiedad de dependencia correctamente. Su get y set deben usar GetValue y SetValue, respectivamente, y no debe tener un miembro de clase para almacenar el valor. El nombre de miembro de la DP también debe ser {PropertyName}Property, p. MyCustomPropertyProperty si el get/set y el nombre de la propiedad como registrado es MyCustomProperty. Ver http://msdn.microsoft.com/en-us/library/ms753358.aspx para más información.

Espero que ayude.

+0

Hola Kieren, en su primer enlace no hay un "constructor" para llamar, se explica sobre el "Método DependencyProperty.Register" que es el que uso. ¿Publicaste el enlace equivocado? En su segundo enlace, se trata de PropertyChangedCallback, ¿de dónde viene esto para resolver mi problema? Mi Dep Prop Setter no va a ser llamado, ¡ese es el problema que estoy teniendo! – Bob

+0

Quise decir el método Register, no el constructor. No se debe invocar al colocador, está utilizando los DP de forma incorrecta y debe seguir el patrón descrito en los enlaces provistos. WPF no llamará a su incubadora, sino que usará SetValue: debe proporcionar un objeto PropertyMetadata con un controlador que WPF llamará cuando cambie su valor. –

1

Puede que esté utilizando MVVM, y anulando el DataContext de la vista?

Si lo hace, el evento para cambiar MyCustomProperty se generará en el original DataContext y no en el nuevo ViewModel.

Cuestiones relacionadas