2009-04-29 12 views
7

Mamy obiekt, który pochodzi z DependencyObject i implementuje niektóre właściwości Dependency.Własne właściwości zależności i wiązanie TwoWay w WPF

Zasadniczo coś takiego:

class Context : DependencyObject { 
    public static readonly DependencyProperty NameProperty = 
    DependencyProperty.Register ("Name", typeof (string), typeof (Context), new PropertyMetadata ("")); 
    public string Name { 
     get { 
      return (string)this.GetValue (NameProperty); 
     } 
     set { 
      this.SetValue (NameProperty, value); 
     } 
    } 
} 

działa ta właściwość jest ustawiony, może być związana, itd. Problem pojawia się, gdy ja wiążą się z propery z WPF, za pomocą wiązania TwoWay. Część TwoWay nigdy się nie dzieje, WPF nigdy nie wywołuje zestawu tej właściwości. Mam ustawiony my wiążących się tak:

<TextBox Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

W tym przypadku, wpisując w polu tekstowym powinien niezwłocznie zaktualizować właściwość imię, ale tak nie jest. Jeśli zmienię właściwość Name na zwykłą właściwość POCO, działa (chociaż druga strona TwoWay oczywiście nie ma znaczenia, chyba że zaimplementuję INotifyPropertyChanged).

Co ja tu robię źle? To powinno być naprawdę proste, ale nie powoduje to bólu głowy.

Odpowiedz

11

To oczekiwane zachowanie. Właściwość CLR jest jedynie opakowaniem wokół podstawowego DependencyProperty. WPF często optymalizuje się, dzwoniąc bezpośrednio pod numer GetValue i SetValue. Jeśli potrzebujesz niestandardowej logiki do wykonania, użyj metadanych z DependencyProperty.

+0

Rany, jestem idiotą. Jesteś w 100% poprawny, sama wartość jest ustawiona poprawnie, ale seter nigdy nie jest wywoływany, co jest tym, co mnie przeraża. Dzięki. –

2

Po kosztować ta sprawa mi trochę czasu:

Dla tych z Was, którzy mają ten sam problem, ale - podobnie jak ja - nie widzę rozwiązania w odpowiedzi powyżej:

Aby możliwe było dziedziczenie DataContext, klasa niestandardowa (kontekst w tym przypadku) musi pochodzić od FrameworkElement zamiast DependencyObject. To wszystko.

Marc

Powiązane problemy