SORU
15 Mart 2013, Cuma


Model değişim ViewModel uyarmak için Nasıl WPF, MVVM - ... yoksa ben mi söyleyeyim?

Bazı MVVM makalelere, öncelikle gidiyorum: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx ve http://rachel53461.wordpress.com/2011/05/08/simplemvvmexample/

Benim belirli bir soru:Nasıl ViewModel, Model Model değişiklikler iletişim kurabilirim?

Josh'un makale, bu böyle yapar anlamıyorum. Bu ViewModel her zaman özellikleri için Model sorar. Rachel bu örnek, o var modeli uygulamak INotifyPropertyChanged ve yükseltir olaylardan modeli, ama onlar için tüketim görüntülemek kendisi (bkz: onu yazı/kod için daha fazla detay neden bunu yapar).

Hiçbir yerde ben model model özellikleri değişir ViewModel uyarıları nerede örneklere bakın. Bu benim belki de bitmedi endişeli nedense.Model değişim ViewModel uyarmak için bir şablon var mı?Öyle görünüyor olması gerektiği gibi (1) bir ihtimal daha var daha 1 ViewModel için her model, ve (2) bile var sadece bir ViewModel, bazı eylem modeli neden olabilir diğer özellikleri olmak değişti.

Formu "Neden bunu yapmak istiyorsun ki sen" yorum, bu yüzden burada benim program açıklaması? cevaplar/yorumlar olabileceğini sanıyorum MVVM yeniyim belki benim tüm tasarım hatalı. Kısaca tarif edeceğim.

Daha ilginç (en azından bana!) bir programlama ediyorum "" veya "" sınıfları. Ürün Müşteri daha BlackJack programlıyorum.

Ve sadece ViewModel (Josh Smith'in makalesi) özellikleri ve komutları için bağlayıcı dayanır arkasında herhangi bir kod yok bir Görünümü var.

İyi günde, kötü günde, çektiğim tutum Modeli içermelidir değil sadece sınıfları gibi PlayingCard, Deck, da BlackJackGame sınıf bu tutar devletin tüm oyun, ve bilir ne zaman oyuncu gitti büstü, bu satıcı için kart çekmek, ve ne oyuncu ve satıcı geçerli puan (daha az 21, 21, büstü, vb.).

Ben ifşa yöntemleri BlackJackGame yöntem gibi "DrawCard" ve aklıma o zaman bir kart çizilir, özellikleri gibi CardScore IsBust olmalı güncellenmiş ve bu yeni değerler Tebliğ ViewModel. Belki hatalı düşünüyor?

Bir ViewModel eğer büstü ise güncelleştirilmiş bir skor için sormak bilmek ve öğrenmek gerekir böylece DrawCard() yöntemi olarak adlandırılan bu tutum alabilir. Görüşler?

Benim ViewModel, bir oyun kartı (takım elbise,rütbe bağlı olarak) gerçek bir görüntü yakalamak ve görüntülemek için kullanılabilir hale getirmek için bir mantık var. Model bu (belki de diğer ViewModel sadece kart görüntüleri oynamak yerine numaralarını kullanır) ile ilgili olmamalıdır. Tabii ki, belki bazı Model bile BlackJack bir oyun kavramı olması gerektiğini söyler ve bu ViewModel olarak ele alınmalıdır? Tüm geribildirim memnuniyetle karşılıyorum.

"Şimdi programlama ve hendek kazma" en açığız. haline bırakın yorumlar, cevaplar, alevler, ve öneriler

Teşekkürler Dave

CEVAP
15 Mart 2013, Cuma


Eğer Modellerde değişim ViewModels uyarmasını istiyorsanız, INotifyPropertyChanged, rehber ilkeler ve ViewModels PropertyChange almak için abone.

Kodunuzu şu şekilde: bir şey olabilir

// Attach EventHandler
PlayerModel.PropertyChanged  = PlayerModel_PropertyChanged;

...

// When property gets changed in the Model, raise the PropertyChanged 
// event of the ViewModel copy of the property
PlayerModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "SomeProperty")
        RaisePropertyChanged("ViewModelCopyOfSomeProperty");
}

Ama genellikle bu sadece eğer birden fazla nesne genellikle durum böyle değil hangi Modelin veri, değişiklik yapacak gerekirse.

Eğer hiç bir durumda değilsin aslında başvuru için Model özellik Ekle PropertyChanged olay için, o zaman kullanabileceğiniz bir Mesajlaşma sistemi gibi Prizma EventAggregator veya MVVM Light Messenger.

brief overview of messaging systems blogumda, ancak özetlemek gerekirse, ben herhangi bir nesne bir mesaj yayın ve herhangi bir nesne, belirli mesajları dinlemek için abone olabilirsiniz. Bir nesneden PlayerScoreHasChangedMessage bir yayın olabilir, ve başka bir nesne duyduğunda mesajları bu tür dinlemek için abone olmanız ve PlayerScore güncelleme özelliği.

Ama bu tarif ettiğim sistem için gerekli olduğunu sanmıyorum.

MVVM ideal bir dünyada, sizin uygulama ViewModels oluşur ve Modeller blok başvurunuzu oluşturmak için kullanılır. Onlar genellikle sadece veri içeriyor, bu yüzden DrawCard() gibi yöntemler (bir ViewModel olurdu) olmazdı

Muhtemelen bu gibi düz Modeli veri nesneleri olurdu:

class CardModel
{
    int Score;
    SuitEnum Suit;
    CardEnum CardValue;
}

class PlayerModel 
{
    ObservableCollection<Card> FaceUpCards;
    ObservableCollection<Card> FaceDownCards;
    int CurrentScore;

    bool IsBust
    {
        get
        {
            return Score > 21;
        }
    }
}

ve ViewModel bir nesne gibi olurdu

public class GameViewModel
{
    ObservableCollection<CardModel> Deck;
    PlayerModel Dealer;
    PlayerModel Player;

    ICommand DrawCardCommand;

    void DrawCard(Player currentPlayer)
    {
        var nextCard = Deck.First();
        currentPlayer.FaceUpCards.Add(nextCard);

        if (currentPlayer.IsBust)
            // Process next player turn

        Deck.Remove(nextCard);
    }
}

(Yukarıdaki nesneleri ama basitlik için yazmadım INotifyPropertyChanged,) uygulamak gerekir

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 1881 Animation

    1881 Animati

    5 EKİM 2013
  • akalyne

    akalyne

    13 Mayıs 2009
  • makemebad35

    makemebad35

    17 NİSAN 2006