2010-04-28 4 views
5

Ho una proprietà di dipendenza int sulla mia casella di testo personalizzata, che contiene un valore di supporto. È legato a un int? proprietà sul DataContext.Il setter della proprietà di dipendenza WPF non si attiva quando PropertyChanged viene attivato, ma il valore di origine non viene modificato

Se si genera l'evento PropertyChanged nel mio DataContext e il valore della proprietà di origine non viene modificato (rimane nullo), il setter della proprietà di dipendenza non viene attivato.

Questo è un problema, perché voglio aggiornare la casella di testo personalizzata (cancella il testo) su PropertyChanged, anche se la proprietà di origine rimane la stessa. Tuttavia, non ho trovato alcuna opzione di binding che faccia ciò che voglio (c'è una proprietà UpdateSourceTrigger, ma voglio aggiornare il target qui, non la fonte). Forse c'è un modo migliore per informare il Textbox di cui ha bisogno per cancellare il suo testo, sono aperto a qualsiasi suggerimento.

Source, come richiesto (semplificato)

DataContext (fonte):

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"); 
     } 
    } 

personalizzato casella di testo (target):

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

Puoi pubblicare un po 'di codice? Renderebbe la comprensione del tuo problema molto più semplice. Come stai sollevando esattamente l'evento PropertyChanged nel tuo DataContext? – wpfwannabe

+0

Dovrebbe essere aggiornato anche se la fonte è la stessa. Pubblica il tuo codice, la soluzione dovrebbe essere facile da individuare. –

+0

Ho pubblicato del codice. L'applicazione è troppo complessa per includere l'intera fonte qui. I nomi sono stati sostituiti. –

risposta

16

Il XAML chiamerà ImpostaValore direttamente, invece di chiamare il tuo setter di proprietà. Non riesco a ricordare esattamente le specifiche, ma mi sono imbattuto in un problema simile qualche tempo fa. Non si deve inserire alcuna logica nel settatore per Valore, ma definire una richiamata per quando la Proprietà di dipendenza cambia e aggiornare il valore da lì.

+0

Ottimo! Stavo cercando perché la mia logica sul set non veniva eseguita. –

+0

+1 - Grazie, Valerie, mi hai salvato la giornata! –