2011-10-19 8 views
11

Mam podstawową funkcjonalność zamkniętą w ViewModelBaseJak dokonać subskrypcji zdarzenia PropertyChanged w moim ViewModelu?

Teraz chcę zobaczyć, kiedy zdarzenia PropertyChanged został podniesiony przez ViewModelBase i działać na nim. Na przykład, gdy jedna właściwość została zmieniona w ViewModelBase - chcę zmienić właściwość na moim ViewModel

Jak to osiągnąć?

public class MaintainGroupViewModel : BaseViewModel<MEMGroup> 
    { 


public abstract class BaseViewModel<T> : NotificationObject, INavigationAware 
     where T : Entity 
    { 
+1

Czy twój 'NotificationObject' implementuje interfejs' INotifyPropertyChanged'? Jeśli tak, to jest to podstawowa subskrypcja zdarzenia. Jeśli nie, powinieneś zaimplementować 'INotifyPropertyChanged'. –

Odpowiedz

9

Obawiam się, że jesteś faktycznie robi ' ręczne powiązanie "(bad) dla właściwości w klasie pochodnej z wartością w klasie bazowej (również źle). Cały punkt korzystania z dziedziczenia jest taki, że klasa pochodna może uzyskać dostęp do rzeczy w klasie bazowej. Użyj modyfikatora protected, aby wskazać, że rzeczy powinny być dostępne tylko dla klas pochodnych.

Proponuję to (potencjalnie) bardziej poprawną metodę:

Klasa bazowa:

protected virtual void OnMyValueChanged() { } 

Pochodzące klasa:

protected override void OnMyValueChanged() { /* respond here */ } 

Naprawdę, zapisz się na imprezie w klasie bazowej klasa, którą piszecie, wydaje się niewiarygodnie zacofana - jaki sens ma dziedziczenie nad kompozycją, skoro zamierzasz się skomponować wokół siebie? Dosłownie prosisz obiekt, by sam sobie powiedział, kiedy coś się stanie. Wywołanie metody jest tym, czego powinieneś użyć w tym celu.

Pod względem "kiedy jedna właściwość została zmieniona na ViewModelBase - chcę zmienić właściwość na moim ViewModel", ... to ten sam obiekt!

+0

Tak, to pachnie :) Mój scenariusz jest podobny do tego ... Mam podstawową funkcjonalność, ale w tym konkretnym przypadku chcę zmienić rozmieszczenie niektórych danych w moim ViewModelu, gdy zmieniły się niektóre dane podstawowe. Klasa podstawowa utrzymuje główną jednostkę danych (powiedzmy Klienta) i chcę ją zaktualizować więcej interfejsu użytkownika, gdy Klient się zmienia – katit

+0

Wciąż sugerowałbym używanie metod zamiast zdarzeń i używanie w razie potrzeby dziedziczenia: tworzenie nowego obiektu zawierającego podstawowy ViewModel, w przeciwnym razie wszyscy będą mieli dostęp do "podstawowej" funkcjonalności bazy ViewModel, który faktycznie wydaje się być modyfikujący, więc klasa pochodna nie pasuje –

+0

Być może metoda jest sposobem na przejście Inny przykład Klasa bazowa utrzymuje "stan" mojego wpisu danych Formularz. Np. NOWE, EDYCJA, DODAJ. Wiązka interfejsu użytkownika wiąże się z tym stanem. W mojej maszynie wirtualnej chcę również wiedzieć o tej zmianie stanu. Mogę stworzyć metodę OnStateChange lub mogę zapisać się do PropertyChanged. Czy widzisz potrzebę ponownego skomponowania lub po prostu utworzenia metod? Metody mogą być "czystsze", aby spojrzeć na – katit

2

Bezpośredni sposób zapisać się do zmian własności używa INotifyPropertyChanged jeśli BaseViewModel realizuje go:

PropertyChanged += (obj, args) => 
    { System.Console.WriteLine("Property " + args.PropertyName + " changed"); } 

Jeśli tak nie jest, to musi być DependencyObject, a twoje właściwości muszą być DependencyProperties (co jest prawdopodobnie bardziej skomplikowanym sposobem).

This article opisuje, jak zapisać się do zmian DependencyProperty.

44

Zwykle używam zarejestrować na wydarzenie PropertyChanged w konstruktorze klasy

public MyViewModel() 
{ 
    this.PropertyChanged += MyViewModel_PropertyChanged; 
} 

i mój obsługi zdarzeń PropertyChanged wygląda następująco:

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    switch (e.PropertyName) 
    { 
     case "SomeProperty": 
      // Do something 
      break; 
    } 
} 
+0

Czy istnieje sposób, aby pozbyć się "magiczne struny" podczas obsługi. (Nie używam C# 6) – Marshal

+0

@Marshal Nie jestem pewien, co z [tym blogem Josha Smitha] (https://joshsmithonwpf.wordpress.com/2009/07/11/one-way-to- uniknąć-bałagan-propertychanged-obsługa zdarzeń /)? – Rachel

+0

Myślę, że to dobre rozwiązanie i wystarczająco testowalne. Dziękuję za wskazanie artykułu. – Marshal

Powiązane problemy