Aracılığıyla paylaş


Bölüm 18'in özeti. MVVM

Not

Bu kitap 2016 baharında yayımlanmıştır ve o zamandan beri güncellenmemiştir. Kitapta değerli kalan çok şey vardır, ancak bazı malzemeler eskidir ve bazı konular artık tamamen doğru veya eksiksiz değildir.

Bir uygulamanın mimarisini oluşturmanın en iyi yollarından biri, kullanıcı arabirimini bazen iş mantığı olarak adlandırılan temel koddan ayırmaktır. Çeşitli teknikler vardır, ancak XAML tabanlı ortamlar için uyarlanmış olan Model-View-ViewModel veya MVVM olarak bilinir.

MVVM ilişkileri

MVVM uygulamasının üç katmanı vardır:

  • Model, bazen dosyalar veya web erişimleri aracılığıyla temel alınan veriler sağlar
  • Görünüm, genellikle XAML'de uygulanan kullanıcı arabirimi veya sunu katmanıdır
  • ViewModel, Modeli ve Görünümü birbirine bağlar

Model, ViewModel'i bilmez ve ViewModel de Görünüm'ü bilmez. Bu üç katman genellikle aşağıdaki mekanizmaları kullanarak birbirine bağlanır:

Görünüm, GörünümModel ve Görünüm

Daha küçük birçok programda (ve hatta daha büyük programlarda), genellikle Model yoktur veya işlevi ViewModel ile tümleştirilir.

ViewModels ve veri bağlama

Veri bağlamalarıyla etkileşime geçmek için ViewModel'in bir özelliği değiştiğinde ViewModel'e bildirimde bulunabilmelidir. ViewModel bunu, ad alanında System.ComponentModel arabirimini uygulayarak INotifyPropertyChanged yapar. Bu, yerine Xamarin.Forms.NET'in bir parçasıdır. (Genel Olarak ViewModel'ler platform bağımsızlığını korumaya çalışır.)

Arabirimi, INotifyPropertyChanged değiştirilen özelliği gösteren adlı PropertyChanged tek bir olay bildirir.

ViewModel saati

Book.Toolkit kitaplığındaXamarin.Forms, zamanlayıcıya göre değişen tür DateTime özelliğini tanımlar.DateTimeViewModel sınıfı, özellik her DateTime değiştiğinde PropertyChanged olayı uygular INotifyPropertyChanged ve başlatır.

MvvmClock örneği bu ViewModel'in örneğini oluşturur ve güncelleştirilmiş tarih ve saat bilgilerini görüntülemek için ViewModel'e veri bağlamaları kullanır.

ViewModel'deki etkileşimli özellikler

Bir ViewModel'deki özellikler, SimpleMultiplier örneğinin SimpleMultiplierViewModel bir parçası olan sınıfı tarafından gösterildiği gibi daha etkileşimli olabilir. Veri bağlamaları iki Slider öğeden multiplicand ve çarpan değerleri sağlar ve ürünü ile Labelgörüntüler. Ancak, XAML'de bu kullanıcı arabiriminde ViewModel veya arka planda kod dosyasında herhangi bir değişiklik olmadan kapsamlı değişiklikler yapabilirsiniz.

Renk GörünümüModeli

Book.Toolkit kitaplığındakiXamarin.Forms, RGB ve HSL renk modellerini tümleştirir.ColorViewModel HslSliders örneğinde gösterilmiştir :

TK'nın üçlü ekran görüntüsü

ViewModel'i Akışa Alma

ViewModels'teki kod, çağrı özelliği adını otomatik olarak alan özniteliği kullanılarak CallerMemberName bir OnPropertyChanged yöntem tanımlanarak kolaylaştırılabilir. Book.Toolkit kitaplığındakiXamarin.Forms sınıf bunu yapar ve ViewModels için bir temel sınıf sağlar.ViewModelBase

Komut arabirimi

MVVM veri bağlamalarıyla ve veri bağlamaları özelliklerle çalıştığından, bir veya Tapped bir olayının işlenmesi Clicked söz konusu olduğunda MVVM'nin ButtonTapGestureRecognizereksik olduğu görülüyor. ViewModel'lerin bu tür olayları Xamarin.Forms işlemesine izin vermek için komut arabirimini destekler.

Komut arabirimi, içinde iki genel özellik ile kendini Button bildirir:

Komut arabirimini desteklemek için, ViewModel öğesinin ICommand özelliğine Command bağlı olan türde bir özellik tanımlaması Buttongerekir. ICommand Arabirimi iki yöntem ve bir olay bildirir:

  • Execute Tür bağımsız değişkenine sahip bir yöntemobject
  • CanExecute Döndüren tür object bağımsız değişkenine sahip bir yöntembool
  • Bir CanExecuteChanged olay

Dahili olarak, ViewModel türündeki ICommand her özelliği arabirimi uygulayan bir sınıfın örneğine ICommand ayarlar. Veri bağlaması aracılığıyla, Button başlangıçta yöntemini çağırır CanExecute ve yöntemi döndürürse falsekendisini devre dışı bırakır. Ayrıca olay için CanExecuteChanged bir işleyici ayarlar ve olay her tetiklendiğinde çağırır CanExecute . Button etkinleştirilirse, öğesine her Button tıklandığında yöntemini çağırırExecute.

öncesi Xamarin.Formsolan bazı ViewModel'leriniz olabilir ve bunlar zaten komut arabirimini destekliyor olabilir. Yalnızca ile Xamarin.FormsXamarin.Forms kullanılması amaçlanan yeni ViewModel'ler için bir Command sınıf ve arabirimini uygulayan ICommand bir Command<T> sınıf sağlar. Genel tür, ve CanExecute yöntemleri için bağımsız değişkenin Execute türüdür.

Basit yöntem yürütmeleri

PowersOfThree örneği, ViewModel'de komut arabiriminin nasıl kullanılacağını gösterir. sınıfı PowersViewModel türündeki ICommand iki özelliği tanımlar ve ayrıca en Command basit oluşturucuya geçirdiği iki özel özelliği tanımlar. Program, bu ViewModel'den iki Button öğe özelliklerine Command veri bağlamaları içerir.

Öğeler Button , kod değişikliği olmadan XAML'deki nesnelerle TapGestureRecognizer kolayca değiştirilebilir.

Hesap makinesi, neredeyse

AddingMachine örneği hem ve ExecuteCanExecute yöntemlerini ICommandkullanır. Book.Toolkit kitaplığında Xamarin.Formsbir AdderViewModel sınıf kullanır. ViewModel türünde ICommandaltı özellik içerir. Bunlar oluşturucusundan Command veCommandoluşturucusundanCommand veCommand<T>oluşturucusundanCommand<T>başlatılır. Ekleme makinesinin sayısal anahtarlarının tümü ile Command<T>başlatılan özelliğe bağlıdır ve için bir string bağımsız değişkendir Execute ve CanExecute belirli anahtarı tanımlar.

ViewModels ve uygulama yaşam döngüsü

AdderViewModel AddingMachine örneğinde kullanılan, ve RestoreStateadlı SaveState iki yöntemi de tanımlar. Bu yöntemler, uyku moduna geçtiğinde ve yeniden başlatıldığında uygulamadan çağrılır.