2010-07-29 29 views
5

Bu soru, bir this older bir sorusudur ve açık bir sorudan daha fazla bir onaydır.Hiyerarşik veri yapısındaki MVVM'ye düzenleme ekleme

ViewModel örneğim, Model'in _modelInst özel bir örneğine sahiptir.
ViewModel, düzenleme sırasında Model verilerine özel erişim sunar (bu nedenle Modelin INotifyPropertyChanged uygulamasını uygulaması gerekmez). Alma

  1. /Model örneğinde doğrudan ayar
    örn:

    Şimdi üç yolu ben adlı model verileri nasıl düzenleneceği ile geldi vardır basit değer alanları
    return _modelInst.fieldname;
    _modelInst.fieldname = value;
    için Bu seferki uygulanması kolay ...

  2. bir ViewModel örneğini oluşturma ve ebeveynin veri yapısı üzerinde faaliyet gösteren
    örn o türü için yeni bir ViewModel oluşturma

    • : daha karmaşık nesne yapılar gibi türleri için.
      ViewModel üst ve alan adını bilir. Bir ContentControl + DataTemplate
    • alma/ortamında o görüntüleyerek
    • : Yalnızca bir alan değişse bile bütün orijinal nesneyi üzerine yazarak parametre olarak fieldname,
      ile ebeveyn yöntemlerle

    Bu, bu yapıların her biri için ebeveyn tarafından uygulanan yeni bir arabirim (_modelInst üzerinde çalışan güncelleme yordamları ile) oluşturmak anlamına gelir. ebeveynin veri yapısının doğrudan bilgiye sahip ViewModel örnekleri oluşturma


  3. ör

    1. komutlar aracılığıyla ebeveyne güncelleme talimatları gönderme her sınıf

    2. için yeni ViewModel oluşturma ebeveyn sınıfları

      • içinde (listelerinde) sınıfları

      • mesajlar
      • yansıma için (ebeveyn, örneği karşılaştırarak hangi çocuğun
        işlevini çağırdığını bilir

    ) kayıtlı tüm çocuklara Bunların hepsi için düzenlenebilir modelin her alanını oluşturma işlevleri uygulamak büyük bir karışıklık vardır.Bir her subobject onun üst ve onun bildiği tek başına yansıma yoluyla çalışan bir jenerik ViewModel, yaratabileceği

(4.) modelin hemen hemen tüm alanları anlamına
... alan adı (bir listede ise + indeksi).
Sadece kök mantığı daha sonra modele müdahale ederdi.
Ancak, bu çözüm yolun _modelInst içinde bir alana kaydedilmesini de gerektirir.

Bunu başarmak için başka (daha basit) bir yol var mı?
MVVM prensiplerini yanlış anladım mı (tekrar)?
MVVM, büyük hiyerarşik veri yapılarının manipülasyonu için uygun mu?

+0

için iCommand nesneleri uygulayan bir CustomerViewModel oluşturun. Ardından, Görünümünüz bu ICommand nesnelerine bağlanmalı ve siz Müşterinin türünde bir CommandParametre (büyük olasılıkla Görünümünüzde bir Yerden Bağlama) göndermelisiniz. –

+0

Bu, düz bir yapı üzerinde iyi çalışır, örn. Müşterilerin bir listesi.Ama daha karmaşık bir ağaç hiyerarşisine sahip olursam, 'liste'irtibat kişisi gibi 'iletişim' iş dünyası, müşteri, özel 've' iş 'bir liste var '...? –

+0

Her Model için ayrı bir ViewModel, evet? Türetilen sınıflar için, şunları deneyebilirsiniz: İş dünyası = İşletme olarak iletişim kur; if (iş! = null) [İşle İlgili Şeyler Yapın] ' –

cevap

0

Bu için mükemmel bir soru: Ben görünümü modelleri ile nesne grafikleri/hiyerarşileri temsil eden yaklaşım MVVM ve öğrenmiş olarak bana biraz yardımcı Orada hissetmiyorum MVC desen ile stok geliyor iyi bir cevaptır.

ViewModels, eşleştirdikleri modelde hiç çocuk yokken harika çalışır.

Ama modeli

 -->Order 

     -->Country 

aşağı sonları tasarım deseni tür (hayal Ülke Müşteri çocuk nesneymiş) Müşteri

olduğu gibi çocuk babasıdır zaman.

Bulduğum en iyi şey, miras kullanmak ve seçici olarak 'u yalnızca viewmodel mantığına ihtiyacınız olan çocuklara sunmaktır. Aksi halde, modeline, modelin miras yoluyla gelecek görünümün özelliklerine erişebilirsiniz.

public class CustomerView: Müşteri // devralır Müşteriden (model) {

public CustomerView(Customer customer) 
{ 
     this.FirstName = customer.FirstName 
     //etc.. 

     //Only if you need it, that is if you have some display-specific 
     //logic relating to country for a given view, you create 
     //a CountryView class that inherits from Country and gets populated 
     //by an instance of it as well 
     this.CountryView = new CountryView(customer.Country) 
} 

public CountryView CountryView {get;set;} //sadly you cannot override Country but you may be able to shadow it. 

public string DisplayColor 
{ 
    if(base.FirstName == "Joe") 
    { 
     return "red"; 
    } 
    return ""; 
} 

} torunları ile uğraşırken bu dağınık alır

. Eğer daha iyi bir çözümü varsa, bunu duymak isterim. RetrieveCustomer, CreateCustomer, UpdateCustomer, DeleteCustomer (tip Müşteri her alma parametresi): Model nesnesi olarak Müşteri varsayarsak

sayesinde

İlgili konular