Blog
Blog HelionBlog HelionBlog HelionBlog Helion
  • Artykuły
  • Autorzy
  • Recenzje
  • Konkursy

INotifyPropertyChanged — łatwiejsza implementacja z Fody

    Blog.helion.pl Artykuły INotifyPropertyChanged — łatwiejsza implementacja z Fody
    NastępnyPoprzedni

    INotifyPropertyChanged — łatwiejsza implementacja z Fody

    By Jerzy Piechowiak | Artykuły, Programowanie | Brak komentarzy | 26 stycznia, 2017 | 2

    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:

     

    public class Person
    {
    	public string GivenNames { get; set; }
    	public string FamilyName { get; set; }
    
    	public string FullName
    	{
    		get
    		{
    			return string.Format("{0} {1}", GivenNames, FamilyName);
    		}
    	}
    }
    

     

    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:

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

     

    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:

     

    
    <?xml version="1.0" encoding="utf-8"?>
    <Weavers>
       <PropertyChanged />
    </Weavers>
    

     

    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:

     

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

     

    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:

         

    Jerzy Piechowiak, MVVM, programowanie
    Avatar

    Jerzy Piechowiak

    Więcej postów od Jerzy Piechowiak

    Podobne posty

    • Przykładowa implementacja MVVM z MVVM Light w WPF

      By Jerzy Piechowiak | Brak komentarzy

      Choć domyślnie aplikacje WPF piszemy z wykorzystaniem code-behind, to nie ma technologicznych przeciwwskazań do zastosowania w tym przypadku wzorca MVVM, do którego ta technologia jest również częściowo przystosowana. Tak naprawdę największa zmiana musi zajść wCzytaj więcej…

    • Nie bój się refaktoryzacji!

      By Jerzy Piechowiak | Brak komentarzy

      Bardzo często w tytułach książek dla programistów można znaleźć określenia typu: „piękny kod”, „czysty kod”, „kod doskonały”, sugerujące, że możliwe jest napisanie programu, którego kod źródłowy jest po prostu idealny. Ale co właściwie znaczy to,Czytaj więcej…

    • Ninject — ciekawa alternatywa dla Autofaca

      By Jerzy Piechowiak | Brak komentarzy

      W poprzednim poście starałem się przedstawić podstawowe różnice między trzema głównymi sposobami rejestracji usług dostępnymi w Autofacu. Kontener ten oferuje szerokie możliwości, dobre czasy „wyciągania” usług, ma także grono wiernych użytkowników. Jednak jeśli spojrzymy na statystykiCzytaj więcej…

    • Autofac — różne sposoby rejestracji usług

      By Jerzy Piechowiak | 2 komentarze

      Gdy dobrych kilka lat temu zaczynałem programować w C#, nie miałem pojęcia o czymś takim jak kontener IoC. Każdy obiekt tworzyłem klasycznie — poprzez zastosowanie słowa kluczowego new: StringBuilder sb = new StringBuilder();

    • C# — poprawna implementacja interfejsu IDisposable

      By Jerzy Piechowiak | 1 komentarz

      C# jest językiem wysokiego poziomu, w którym przygotowano liczne gotowe komponenty i usprawnienia, jakich nie znajdziemy u konkurencji. Takie podejście ma sporo zalet, ponieważ nie musimy przejmować się wieloma rzeczami, które w innych językach musielibyśmyCzytaj więcej…

    NastępnyPoprzedni

    Znajdź post

    Bądźmy w kontakcie

    Książka dnia

    Amazon Web Services. Podstawy korzystania z chmury AWS

    Autor: Mark Wilkins

    Cena: 44.50 zł 89.00 zł
    (Cena e-booka: 44.50 zł 89.00 zł)

    O 44,5zł taniej!

    kup teraz

    Ostatnie wpisy

    • Błyskawiczny kurs pisania skryptów powłoki
    • Przykładowa aplikacja webowa zaimplementowana w ASP .NET Core
    • Wprowadzenie do .NET Core: instalacja, konfiguracja, pierwsza aplikacja w systemie Linux
    • Grupa Helion zaprasza na szkolenia stacjonarne!
    • Hello World! Czym jest programowanie?

    Tagi

    .net agile altcontroldelete asp.net c# czysty kod debugowanie design patterns e-biznes emarketing Google Google Analytics hacking Jerzy Piechowiak kod kodowanie Krzysztof Marzec książka Maciej Dutko magazyn programista Magdalena Daniłoś marketing MVVM onepress organizacja czasu praca prograista programista programowanie prokrastynacja rafał kocisz reklama rozwój software craftsman SOLID startup techniki programowania testowanie video marketing visual studio WPF wzorce projektowe youtube zarządzanie czasem zarządzanie projektami

    Archiwum

    • lipiec 2017
    • czerwiec 2017
    • maj 2017
    • kwiecień 2017
    • marzec 2017
    • luty 2017
    • styczeń 2017
    • grudzień 2016
    • listopad 2016
    • październik 2016
    • wrzesień 2016
    • lipiec 2016
    • czerwiec 2016
    Blog wydawnictwa
    Informatyka w najlepszym wydaniu
    Strona wydawcy:
    www.helion.pl
    Księgarnia Helion.pl
    Nowości
    Bestsellery
    Promocje
    Bądźmy w kontakcie:
    Chcesz zostać autorem?
    Masz pytania do redakcji?
    Napisz do nas »
    • Artykuły
    • Autorzy
    • Recenzje
    • Konkursy
    Blog Helion