2016-07-21 22 views
0

Ich habe diesen Beispielcode beim Erstellen eines neuen MVVM Light (WPF451) -Projekts erhalten und es hat mich verwirrend gemacht.Was ist der Zweck von DataItem im MVVM-Light-Beispielcode? Warum wird es so umgesetzt?

DataItem.cs:

public class DataItem 
{ 
    public string Title { get; private set; } 

    public DataItem(string title) 
    { 
     Title = title; 
    } 
} 

Diese Klasse eine Reihe von Eigenschaften erklärt, die in dem Ansichtsmodell benötigt wird. Es wird im Model-Layer-DataService verwendet, der der VM in ihrem Konstruktor Daten bereitstellt.

DataService.cs

public class DataService : IDataService 
{ 
    public void GetData(Action<DataItem, Exception> callback) 
    { 
     // Use this to connect to the actual data service 

     var item = new DataItem("Welcome to MVVM Light"); 
     callback(item, null); 
    } 
} 

Ich dachte, es wäre auch in der VM verwendet werden, um Eigenschaften zu halten, wie folgt aus:

public DataItem Data { get; set; } 

aber das MVVM Licht Entwickler entschieden, stattdessen zu Deklarieren Sie die Eigenschaften in der VM erneut.

MainViewModel.cs:

public class MainViewModel : ViewModelBase 
{ 
    private readonly IDataService _dataService; 

    private string _welcomeTitle = string.Empty; 
    public string WelcomeTitle 
    { 
     get{ return _welcomeTitle; } 
     set{ Set(ref _welcomeTitle, value); } 
    } 

    public MainViewModel(IDataService dataService) 
    { 
     _dataService = dataService; 
     _dataService.GetData(
      (item, error) => 
      { 
       WelcomeTitle = item.Title; 
      }); 
    } 
} 

konnte ich nicht verstehen, warum sie so umgesetzt werden. Ja, es reduziert das redundante INotifyPropertyChanged-implementierte Objekt, so dass es weniger Ressourcen verbraucht. Wenn ich jedoch Tonnen von Eigenschaften in die VM implementieren musste, muss ich Eigenschaften sowohl auf VM als auch auf DataItem schreiben, und auch wenn ich Eigenschaften hinzufügen oder löschen möchte, muss ich beide bearbeiten.

Konnte ich nicht einfach eine DataItem-Eigenschaft in der VM halten? Oder fehlt mir etwas?

+0

"Konnte ich nicht einfach eine DataItem-Eigenschaft in der VM halten?" Natürlich könnten Sie das, aber die Modelleigenschaften hier verursachen kein PropertyChanged-Ereignis, weil DataItem nicht INotifyPropertyChanged implementiert. Sie benötigen also immer noch einen Wrapper für jedes Propery. Wenn die DataItem-Instanz beim Aktualisieren jedoch durch eine neue ersetzt wird, ist dies nicht erforderlich. – Clemens

+0

Es gibt ungefähr zwanzig "Mein Ansichtsmodell HERP benötigt Wert A von Eigentum X vom Ansichtsmodell DERP. Wie bekomme ich es?" Fragen eine Woche in der MVVM-Tag. Die einfache Antwort ist, dass HERP auf DERP verweisen muss. Aber die Menschen können oft nicht herausfinden, wie sie sie miteinander verbinden. Daher stellen einige Frameworks ein generisches Mittel zur Kommunikation zwischen Ansichtsmodellen bereit. Dies ist ein Beispiel für ein generisches Kommunikationsmittel. – Will

Antwort

0

DataItem repräsentiert einfach die Model in diesem Fall. Wenn eine Entität ist, die nicht geändert werden kann (Datenbank automatisch generiertes POCO), würde dieses Szenario funktionieren.

Ja, Sie müssen jede anwendbare Model Eigenschaft in Ihrem ViewModel, so dass es RaisePropertyChanged haben kann, und ja, das ist mehr "Arbeit", aber es bietet eine Abstraktion zwischen den beiden.

Manche Menschen mit Modifizierung der Model in Ordnung sind, um es INotiftyPropertyChanged umzusetzen zu haben, glauben andere die Model sollte nicht und die ganze Arbeit in der ViewModel (was ist das, was in diesem Fall getan wird) durchgeführt werden soll.

+1

Danke Ich habe endlich das Licht! Realisierte, dass die Idee von Model in meinem Kopf durcheinander war. – monasph3my