2010-04-28 9 views
5

Posiadam właściwość int dependency na moim niestandardowym polu tekstowym, który zawiera wartość podkładu. Jest związany z int? właściwość w DataContext.Wyzwalacz właściwości zależności nie jest uruchamiany, gdy funkcja PropertyChanged jest uruchamiana, ale wartość źródłowa nie jest zmieniana.

Jeśli podniosę zdarzenie PropertyChanged w moim DataContext, a wartość właściwości źródłowej nie zostanie zmieniona (pozostanie pusta), to ustawienie właściwości zależności nie zostanie uruchomione.

Jest to problem, ponieważ chcę zaktualizować niestandardowy obiekt Textbox (wyczyść tekst) w oknie PropertyChanged, nawet jeśli właściwość źródłowa pozostanie taka sama. Jednak nie znalazłem żadnej wiążącej opcji, która robi to, co chcę (jest właściwość UpdateSourceTrigger, ale chcę zaktualizować cel tutaj, a nie źródło). Być może jest lepszy sposób, aby poinformować pole tekstowe, że musi usunąć tekst, jestem otwarty na wszelkie sugestie.

Źródło, zgodnie z wnioskiem (uproszczony)

DataContext (źródło):

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

niestandardowe pole tekstowe (docelowy):

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

Czy możesz dodać kod? Ułatwi to zrozumienie twojego problemu. Jak dokładnie podnosisz zdarzenie PropertyChanged w swoim DataContext? – wpfwannabe

+0

Należy zaktualizować, nawet jeśli źródło jest takie samo. Opublikuj swój kod, rozwiązanie powinno być łatwe do wykrycia. –

+0

Wysłałem kod. Aplikacja jest zbyt skomplikowana, aby uwzględnić tutaj całe źródło. Nazwy zostały zastąpione. –

Odpowiedz

16

XAML wezwie setValue bezpośrednio, zamiast dzwonić twój lokator nieruchomości. Nie pamiętam dokładnie szczegółów, ale jakiś czas temu natknąłem się na podobny problem. Nie powinieneś umieszczać żadnej logiki w ustawieniu dla wartości, zamiast tego definiować wywołanie zwrotne dla zmiany właściwości Dependency Property i aktualizować z niej wartość.

+0

Świetnie! Szukałem, dlaczego moja logika na planie nie została wykonana. –

+0

+1 - Dzięki, Valerie, uratowałeś mój dzień! –

Powiązane problemy