2013-07-03 9 views
5

Mam aplikację C# WPF MVVM, która działa poprawnie.Zdarzenie WPF RaisePropertyChanged na utraconym skupieniu

Jedynym problemem jest modyfikowanie pola tekstowego i kliknięcie menu. Jeśli zrobię to bez klikania na inną kontrolkę, zdarzenie view-> viewmodel nigdy nie zostanie wywołane, ponieważ pole tekstowe nie straciło ostrości. Popraw mnie, jeśli się mylę, ale myślę, że RaisePropertyChanged jest uruchamiany tylko na LostFocus (lub OnBlur, lub jakiekolwiek podobne wydarzenie).

Kliknięcie przycisku Zapisz menu zaraz po edycji pola tekstowego powoduje, że model podglądu zapisuje dane przy użyciu starych wartości.

Więc wznowieniu:

Sekwencja ta działa dobrze:

  1. Edytuj pole tekstowe
  2. Kliknij na innej kontroli
  3. RaisePropertyChanged jest zwolniony, ViewModel jest aktualizowana
  4. Click on przycisk zapisu w menu
  5. Dane zapisane z prawidłowymi wartościami

Sekwencja ta daje mi błąd:

  1. Edytuj pole tekstowe
  2. Kliknij przycisk Zapisz w menu
  3. dane zapisane z prawidłowymi wartościami

Jak rozwiązać ten problem ?

Odpowiedz

10

To jest typowe hasło z TextBoxami zarówno w WPF, jak i WinForm. Możesz obejść to, instruując system bindowania, aby zaktualizował maszynę wirtualną przy każdej zmianie w TextBox, zamiast tracić ostrość. Aby to zrobić, ustaw UpdateSourceTrigger wiązania na PropertyChanged. Spowoduje to odpisanie na maszynę wirtualną za każdym razem, gdy TextBox podniesie zdarzenie PropertyChanged dla swojej właściwości .

<TextBox Text="{Binding MyText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
8

Dla właściwości zależnej TextBox.Text domyślną wartością jest UpdateSourceTrigger: LostFocus (tj. Właściwość modelu widoku jest aktualizowana, gdy kontrolka utraci ostrość). Aby zaktualizować właściwość natychmiast po wprowadzeniu tekstu, ustaw UpdateSourceTrigger=PropertyChanged. (Zobacz powyższy link, aby uzyskać więcej informacji - faktycznie obejmuje to konkretnie przykład.)