2010-04-28 11 views
5

Tengo una propiedad de dependencia int en mi Textbox personalizado, que tiene un valor de respaldo. Está vinculado a un int? propiedad en el DataContext.El conjunto de propiedades de dependencia de WPF no se activa cuando se activa PropertyChanged, pero el valor de origen no se cambia

Si visualizo el evento PropertyChanged en mi DataContext, y el valor de la propiedad de origen no cambia (permanece nulo), el filtro de la propiedad de la dependencia no se activa.

Esto es un problema, porque quiero actualizar el cuadro de texto personalizado (borrar el texto) en PropertyChanged, incluso si la propiedad de origen se mantiene igual. Sin embargo, no encontré ninguna opción vinculante que haga lo que quiero (hay una propiedad UpdateSourceTrigger, pero quiero actualizar el objetivo aquí, no la fuente). Quizás haya una mejor manera de informar al Textbox que necesita borrar su texto, estoy abierto a cualquier sugerencia.

Fuente, conforme a lo solicitado (simplificado)

DataContext (fuente):

private int? _foo; 

    public int? Foo 
    { 
     get 
     { 
      // The binding is working, because _foo is retrieved (hits a breakpoint here). 
      // RaisePropertyChanged("Foo") is called from elsewhere, even if _foo's value is not changed 
      return _foo; 
     } 
     set 
     { 
      // Breakpoint is hit on user input, so the binding is working 
      _foo = value; 
      RaisePropertyChanged("Foo"); 
     } 
    } 

personalizada del cuadro de texto (objetivo):

public double? Value 
{ 
    get 
    { 
     return (double?)GetValue(ValueProperty); 
    } 
    set 
    { 
      // When Foo is null and Value is also null, the breakpoint is not hit here 
      SetValue(ValueProperty, value); 

      // This is the piece of code that needs to be run whenever Value is set to null 
      if (value == null && !String.IsNullOrEmpty(Text)) 
      { 
       Text = String.Empty; 
      } 
     } 
    } 

    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double?), typeof(CustomTextbox), new PropertyMetadata(null, ValueChangedHandler)); 

    private static void ValueChangedHandler(DependencyObject dependecyObject, DependencyPropertyChangedEventArgs e) 
     { 
      // When Foo is null and Value is also null, the breakpoint is not hit here 
     } 
+1

¿Se puede publicar algún código? Haría que entender su problema sea mucho más fácil. ¿Cómo está generando el evento PropertyChanged en su DataContext? – wpfwannabe

+0

Se debe actualizar incluso si la fuente es la misma. Publique su código, la solución debe ser fácil de detectar. –

+0

Publiqué algún código. La aplicación es demasiado compleja para incluir toda la fuente aquí. Los nombres fueron reemplazados. –

Respuesta

16

El XAML llamará FijarValor directamente, en lugar de llamar su setter de propiedad. No recuerdo exactamente los detalles, pero me encontré con un problema similar hace un tiempo. No debe poner ninguna lógica en el ajustador para el valor, en su lugar defina una devolución de llamada para cuando cambie la propiedad de dependencia, y actualice el valor desde allí.

+0

¡Genial! Estaba buscando por qué mi lógica en el set no se estaba ejecutando. –

+0

+1 - Gracias, Valerie, ¡me salvaste el día! –

Cuestiones relacionadas