2009-03-13 15 views
2

Also sagen wir, ich habe ein OrderModel und ein OrderViewModel. Ich habe die Eigenschaften Lieferant, Bestelldatum, usw. auf dem ViewModel und dem Model und sie sind verbunden. Sehen Sie Beispiele dafür und scheint gerade genug, obwohl etwas in Bezug auf Schreibsettern/Getters dupliziert.Silverlight MVVM Header-Detail

Nun, was mache ich mit den OrderDetails? In meinem Modell hätte ich eine Liste.

Verfüge ich über ein OrderDetailViewModel für die OrderDetail? Wenn ja, wie liefert das OrderViewModel das? Als ObservableCollection? Und wenn ja, wie halten Sie das synchron mit der ursprünglichen Liste?

Hier habe ich kein anständiges Beispiel gesehen. Wenn es jemanden gibt, auf den mich jemand hinweisen könnte, würde ich das schätzen. Ich liebe das Konzept der MVVM, aber ich fange an, es eine verdammt viel Overhead Sache. Warum nicht einfach das ViewModel den Modellteil handhaben? In den täglichen LOB-Apps gibt es wirklich so viel Unterschied zwischen den beiden, um den gesamten Code zu rechtfertigen, den echte MVVM benötigt.

Antwort

1

Es sieht so aus, was Sie brauchen: http://jonas.follesoe.no/SpeakingAtMSDNLiveNextMonth.aspx

Eine Übersetzung auf Google gibt diese als abstrakt für die Diskussion:

Silverlight 2 im Herbst dieses Jahres veröffentlicht wurde, und legt eine gute Grundlage für Entwickler, die wollen Rich Internet Applications (RIA) basierend auf erstellen. NETZ. In dieser Session haben wir uns in Silverlight 2 ausführlich mit dieser Entwicklung und den Vorteilen der Wahl von Silverlight 2 als Plattform für datenzentrierte Geschäftsanwendungen befasst. Die Sitzung behandelt unter anderem den Datenzugriff über gesicherte WCF-Dienste, die Strukturierung des Codes mithilfe des Model-View-View-Modellmusters (MVVM), das Schreiben von Code, die Zusammenarbeit mit Konstrukteuren und einfache Blend-Tipps für Entwickler . Die Sitzung wird um eine Tauchprotokollanwendung herum aufgebaut, in der der Code nach der Präsentation verfügbar sein wird.

jedoch in der Zwischenzeit Jonas hat bereits darüber gesprochen, MVVM hier:

http://jonas.follesoe.no/YouCardRevisitedImplementingTheViewModelPattern.aspx

1

Sie so etwas wie dieses können Sie Ihre ObservableCollections synchronisiert zwischen dem Modell und View-Modell zu halten:

/// <summary> 
/// Keeps one collection synchronised with another. 
/// </summary> 
/// <typeparam name="Source">The type of the source items.</typeparam> 
/// <typeparam name="Destination">The type of the destination items.</typeparam> 
public class CollectionSync<Source, Destination> 
{ 
    private readonly Func<Source, Destination> _destItemFactory; 
    private readonly Action<Destination>  _destItemRemover; 

    private readonly IList<Destination> _destList; 
    private readonly IList<Source>  _sourceList; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="CollectionSync&lt;Source, Destination&gt;"/> class. 
    /// </summary> 
    /// <param name="sourceList">The source list.</param> 
    /// <param name="destList">The destination list.</param> 
    /// <param name="destItemFactory">Factory method which creates a Destination for a given Source.</param> 
    /// <param name="destItemRemover">Method called when a Destination is removed.</param> 
    public CollectionSync(IList<Source> sourceList, 
          IList<Destination> destList, 
          Func<Source, Destination> destItemFactory, 
          Action<Destination> destItemRemover) 
    { 
     _destItemFactory = destItemFactory; 
     _destItemRemover = destItemRemover; 
     _sourceList = sourceList; 
     _destList = destList; 

     ((INotifyCollectionChanged) _sourceList).CollectionChanged += SourceCollection_CollectionChanged; 

     PopulateWithAllItems(); 
    } 

    private void PopulateWithAllItems() 
    { 
     foreach (Source sourceItem in _sourceList) 
      _destList.Add(_destItemFactory(sourceItem)); 
    } 

    private void SourceCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs args) 
    { 
     switch (args.Action) 
     { 
      case NotifyCollectionChangedAction.Add: 
       OnItemsAdded(args.NewStartingIndex, args.NewItems); 
       break; 
      case NotifyCollectionChangedAction.Remove: 
       OnItemsRemoved(args.OldStartingIndex, args.OldItems); 
       break; 
      case NotifyCollectionChangedAction.Reset: 
       OnItemsReset(); 
       break; 
      case NotifyCollectionChangedAction.Move: 
      case NotifyCollectionChangedAction.Replace: 
       throw new NotImplementedException(); 
     } 
    } 

    private void OnItemsReset() 
    { 
     _destList.Clear(); 
     PopulateWithAllItems(); 
    } 

    private void OnItemsRemoved(int index, ICollection items) 
    { 
     int itemCount = items.Count; 
     for (int i = 0; i < itemCount; i++) 
     { 
      Destination removed = _destList[index]; 
      _destList.RemoveAt(index); 
      if (_destItemRemover != null) 
       _destItemRemover(removed); 
     } 
    } 

    private void OnItemsAdded(int index, IList items) 
    { 
     int itemIndex = index; 
     foreach (Source item in items) 
     { 
      // Add to Items collection 
      _destList.Insert(itemIndex, _destItemFactory(item)); 
      itemIndex++; 
     } 
    } 
} 

Wenn Sie das Beispiel Order/OrderDetails verwenden, würden Sie die beiden ObservableCollections in Ihrem Order-Ansichtsmodell folgendermaßen verbinden:

0

Wenn es um die Frage "Benötige ich ein anderes Ansichtsmodell" geht, lautet meine Antwort: Wenn Ihre gesamte Ansicht die Modelldaten anzeigt, können Sie direkt direkt an die Bestellung binden. Ein ViewModel hierfür zu erstellen wäre sehr redundant. Die Zeit, zu der das ViewModel erstellt werden muss, ist, wenn Sie im Bildschirm "Bestelldetails" Logik oder Status haben, der dargestellt werden muss. Anstatt dies dem Modell hinzuzufügen, erstellen Sie zu diesem Zeitpunkt ein ViewModel.

Soweit diese Elemente synchronisiert, Ähnlich GraemeF habe ich eine Binder-Klasse erstellt, die Reflexion verwendet, um zwei Werte miteinander zu verbinden. Es hält meine Modell- und Ansichtsmodelleigenschaften synchron und kann verwendet werden, um andere Dinge wie diese bestimmte Sammlung zu synchronisieren. Es gibt einen gewissen Mehraufwand bei der Erstellung eines Ordners wie diesem, aber sobald dies erledigt ist, können Sie Datenkorrelationen auf eine funktionale Weise spezifizieren, was wirklich nett ist.

Verwandte Themen