W poprzednim wpisie zaprezentowałem przykładowe wdrożenie wzorca MVVM z wykorzystaniem biblioteki MVVM Light. Wspomniana biblioteka upraszcza sporo cz

W poprzednim wpisie zaprezentowałem przykładowe wdrożenie wzorca MVVM z wykorzystaniem biblioteki MVVM Light. Wspomniana biblioteka upraszcza sporo czynności, m.in. implementację interfejsu INotifyPropertyChanged, który jest kluczowym elementem każdego modelu w technologiach wykorzystujących data binding. Standardowe wdrożenie tego interfejsu nie jest skomplikowane, aczkolwiek jego rezultatem jest dużo powtarzalnego kodu. Mimo że kolejne wersje C# upraszczały tę implementację, wciąż można zrobić to ładniej. Wystarczy tylko skorzystać z biblioteki Fody.PropertyChanged.    

Standardowe wdrożenie

Naszą bazą będzie klasa Person przedstawiona na stronie projektu. Poniżej jej kod wyjściowy:   [sourcecode language="csharp"] public class Person { public string GivenNames { get; set; } public string FamilyName { get; set; } public string FullName { get { return string.Format("{0} {1}", GivenNames, FamilyName); } } } [/sourcecode]   W tym przypadku mamy do czynienia z dwoma właściwościami ustawianymi wprost oraz z jedną, która jest konkatenacją dwóch powyższych. Ponieważ właściwość FullName nie posiada seta, musimy w jakiś sposób powiadomić korzystający z niej UI o tym, że trzeba pobrać wartość tego pola ponownie. Na szczęście da się ten problem rozwiązać za pomocą interfejsu INotifyPropertyChanged: [sourcecode language="csharp"] public class Person : INotifyPropertyChanged { private string givenNames; private string familyName; public event PropertyChangedEventHandler PropertyChanged; public string GivenNames { get { return givenNames; } set { if (value != givenNames) { givenNames = value; OnPropertyChanged("GivenNames"); OnPropertyChanged("FullName"); } } } public string FamilyName { get { return familyName; } set { if (value != familyName) { familyName = value; OnPropertyChanged("FamilyName"); OnPropertyChanged("FullName"); } } } public string FullName { get { return string.Format("{0} {1}", GivenNames, FamilyName); } } public virtual void OnPropertyChanged(string propertyName) { var propertyChanged = PropertyChanged; if (propertyChanged != null) { propertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } [/sourcecode]   Jak widać, nasza prosta klasa zrobiła się bardzo rozbudowana, a standardowa implementacja wymaga od dewelopera:

  • deklaracji zmiennych prywatnych dla każdej z zastosowanych właściwości,
  • wywołania metody OnPropertyChanged przy ustawieniu każdej właściwości.

  Pewną wariancją tego rozwiązania jest opcja z wykorzystaniem parametru/atrybutu CallerMemberName, który pozwala na wyeliminowanie manualnego podawania nazw aktualizowanych właściwości. Dzięki temu zmniejszamy liczbę miejsc, w których mogłyby się pojawić potencjalne literówki, które przeszłyby przez kompilator.  

PropertyChanged.Fody

  Fody jest specjalną biblioteką, która pozwala na manipulację wynikowym kodem IL. Rozwiązanie to dostarcza mechanizm, który później może zostać wykorzystany do uruchomienia konkretnych pluginów, w tym przypadku nazywanych weaverami. Pluginy dodajemy do pliku FodyWeavers.xml, który po zainstalowaniu paczki PropertyChanged.Fody powinien prezentować się następująco:   [sourcecode language="xml"] <?xml version="1.0" encoding="utf-8"?> <Weavers> <PropertyChanged /> </Weavers> [/sourcecode]   Następnie możemy dokonać modyfikacji naszej klasy Person. Aby wtłoczyć do niej „dynamiczną” obsługę interfejsu INotifyPropertyChanged, wystarczy dodać odpowiedni atrybut do naszej bazowej postaci:   [sourcecode language="csharp"] [ImplementPropertyChanged] public class Person { public string GivenNames { get; set; } public string FamilyName { get; set; } public string FullName { get { return string.Format("{0} {1}", GivenNames, FamilyName); } } } [/sourcecode]   Wynikowo uzyskamy dokładnie taki sam efekt jak w pierwotnie przedstawionej wyżej wersji rozbudowanej, jednak kod tworzony przez dewelopera będzie czysty. Aktywację Fody można podejrzeć w oknie Output w Visual Studio.  

Jerzy Piechowiak

Altcontroldelete.pl

 


Szukasz informacji? Kliknij poniżej: