5

Piszę aplikację komputerową w języku C#, używając wzorca MVVM z modelem Entity Framework. Używam DependencyProperties w moich maszynach wirtualnych i przyszedłem (ogólnie) wolę ten system od implementacji INotifyPropertyChanged. Chciałbym zachować spójność. Moja maszyna wirtualna uzyskuje dostęp do Jednostek w Modelu i udało mi się zachować rzeczy całkiem odrębne - widok nie ma wiedzy o maszynie wirtualnej z wyjątkiem nazw wiążących i poleceń, a model zna wiedzę na temat maszyny wirtualnej.Używanie DependencyProperty na ViewModel z Entity Framework

Korzystanie INotifyPropertyChanged w VM, wydaje się dość łatwe do aktualizacji podmiotów, w Modelu:

public string Forename 
    { 
     get { return CurrentPerson.Forename; } 
     set 
     { 
      if (Forename != value) 
      { 
       CurrentPerson.Forename = value; 
       NotifyPropertyChanged("Forename"); 
      } 
     } 
    } 

... gdzie CurrentPerson jest obiektem osobowe auto stworzone przez podmiot danych modelu. Dlatego nie ma prywatnego pola stworzonego specjalnie do przechowywania imienia.

Z DependencyProperties, wydaje się, że musiałbym utworzyć DP, dodać domyślną właściwość, używając GetValue i Setvalue, a następnie użyć PropertyChangedCallback w celu aktualizacji jednostki CurrentPerson. Wywołanie połączenia zwrotnego w tej sytuacji wydaje się zwiększać obciążenie, aby zachować spójność z innymi maszynami wirtualnymi.

Pytanie brzmi zatem, czy jedna lub druga z tych metod to sposób, w jaki powinienem wykonać ? W takim przypadku należy użyć DependencyProperty lub INotifyPropertyChanged? Należy zwrócić uwagę na to, że potencjalnie będzie to projekt na dużą skalę (z wtyczkami i wieloma dostępami do baz danych z różnych maszyn) i że wszystko powinno być tak samo możliwe do ponownego użycia, a moduły jak "odłączone", jak to możliwe. .

+0

Co jest zaletą korzystania z właściwości zależnościami w widoku modelu? Innymi słowy - jaką dodatkową wartość przynosi, że 'INotifyPropertyChanged' nie oferuje. –

+0

Szukam dobrej prędkości i ładnych funkcji wiązania, które pochodzą z DP. Pamiętaj, że jestem związany bezpośrednio z DP z XAML w moim widoku. Prawdopodobne są również częste zmiany wartości nieruchomości. Z referencji, które wcześniej znalazłem, dla szybkości z wiązaniem, DP są do zrobienia. Jest też spójność z resztą mojego projektu. Jednak żadna z tych rzeczy nie jest dobra, jeśli zostanie zanegowana przez wszystkie wywołania zwrotne, które są wykonywane z osobnymi zmianami w obiektach Entity. –

Odpowiedz

2

Polecam używać INotifyPropertyChanged zamiast DependencyProperty. Głównym powodem, dla którego trzymam się z dala od DependencyProperty w ViewModels jest fakt, że DependencyProperty znajduje się w pliku WindowsBase.dll. To wiąże cię z interfejsem Windows nieco za dużo (przynajmniej IMHO).

Używanie INotifyPropertyChanged jest o wiele łatwiejsze w utrzymaniu, ponieważ pozwala różnym wtyczkom implementować je tak, jak chcą. Jeśli wymusisz właściwości zależności, wszystkie modele widoku muszą dziedziczyć po obiekcie DependencyObject.

Zobacz ten artykuł Więcej informacji na temat korzystania z INotifyPropertyChanged i DependencyProperty: http://kentb.blogspot.com/2009/03/view-models-pocos-versus.html

Inna odpowiedź wspieranie: https://stackoverflow.com/a/783154/27669

+0

Dzięki. Sądzę, że INOTifyPropertyChanged będzie drogą do zrobienia, chociaż zdarzenie z różnymi zabezpieczeniami do używania "Magic Strings" w INotifyPropertyChanged, nadal uważam, że DP jest bardziej elegancki. Dwa główne powody, dla których przychodzę do tego punktu widzenia to: 1) Duplikacja stanu z DP i 2) Fakt, że czasami potrzebuję zmienić cały stan obiektu, i mogę to zrobić po prostu z PropertyChanged (null). Dzięki za odpowiedź i referencje. –

+0

Sprzężenie z interfejsem użytkownika Windows może być poważnym problemem. Po prostu naprawiono projekt, w którym do usługi sieciowej użyto tych samych bibliotek dll, ale właściwość Dependency upierała się, że działa w wątku UI, co jest dość trudne w wielowątkowej usłudze internetowej.Ta elastyczność architektury (tj. Brak ścisłego połączenia z GUI systemu Windows w bibliotekach Entity) jest o wiele ważniejsza niż elegancja dla GUI. – user1496062