MVVM Pattern in Xamarin Project using MvvmCross

Salah satu jenis pattern yang sering digunakan pada pengembangan aplikasi dekstop dan mobile dalah Model-View View Model. Seperti pattern MVC, MVVM juga memisahkan application logic dan User Interface sehingga aplikasi akan lebih mudah ditest, dimaintenance  dan dikembangkan.

Ada 3 komponen yaitu: model, view dan view model. Masing-masing memiliki peran dan tanggung jawab yang berbeda seperti diilustrasikan pada gambar berikut ini.

ic564167

Kita akan membuat project sederhana menggunakan Xamarin. Pilih Cross-Platform->Portable project

mvvmcross1

Kita akan melihat ada 3 project, portable, android dan ios.

MvvmCross2.png

Kita akan rename BookStoreMvvm.Core.Droid menjadi BookStoreMvvm.UI.Droid. Selanjutnya lewat nuget, install MvvmCross.Core

MvvmCross4.png

Pada project .Portable kita buat sebuah interface untuk service.

public interface ICalculatorService
{
int Add(int number1, int number2);
}

Kemudian class Implementasinya.

public class CalculatorService : ICalculatorService
{
public int Add(int number1, int number2)
{
return number1 + number2;
}
}

Sekarang kita buat sebuah class View Model yang inherit dari class MvxViewModel, karena dalam MvvmCross semua View Model harus merupakan class turunan dari MvxViewModel.

public class CalculatorViewModel : MvxViewModel
{
ICalculatorService _calculatorService;
public CalculatorViewModel(ICalculatorService calculatorService)
{
_calculatorService = calculatorService;
}
public override void Start()
{
Add();
base.Start();
}

int _operand1;
public int Operand1
{
get { return _operand1; }
set
{
_operand1 = value;
Add();

}
}

int _operand2;
public int Operand2
{
get { return _operand2; }
set
{
_operand2 = value;
Add();

}
}
int _result;
public int Result
{
get { return _result; }
set {
_result = value;
RaisePropertyChanged(() => Result);
}
}

private void Add()
{
Result = _calculatorService.Add(_operand1, _operand2);
}
}

RaisePropertyChanged(), artinya kita memberikan notifikasi bahwa sebuah property telah berubah sehingga pada UI nilainya akan disesuaikan dengan perubahan. Jadi sini, jika property Result di set pada setiap pemanggilan method Add(), maka nilai result pada UI akan ikut berubah.

Karena pada class di atas kita menggunakan dependency injection -yaitu dengan melewatkan tipe ICalculatorService pada konstruktor, kita perlu meregistrasi interface dan class implementasinya disebuah class App. Class App ini juga akan menentukan ViewModel mana yang akan digunakan saat Start.

public class App : MvxApplication
{
public App()
{
Mvx.RegisterType<ICalculatorService, CalculatorService>();
Mvx.RegisterSingleton(new MvxAppStart());
}
}

Selanjutnya pada project .Droid kita hapus MainActivity dan Main.axml. Kita tidak membutuhkan file-file itu lagi.

mvvm_34.png

Selanjutnya buatlah class Setup untuk melakukan inisialiasi framework MvvmCross pada project android kita. Untuk android, class Setup harus merupakan turunan dari MvxAndroidSetup.

public class Setup : MvxAndroidSetup
{
public Setup(Context applicationContext) : base(applicationContext)
{
}

protected override IMvxApplication CreateApp()
{
return new App();
}
}

Kemudian kita buat sebuah layout (.axml) seperti ini.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res/BookStoreMvvm.UI.Droid"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        local:MvxBind="Text Operand1" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        local:MvxBind="Text Operand2" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        local:MvxBind="Text Result" />
</LinearLayout>

local:MvxBind artinya field ui yang kita buat akan melakukan binding dengan property sebuah ViewModel.

Selanjutanya kita buat sebual class view (kalau pada Xamarin Form kita menyebutnya Activity), yang merupakan turunan dari MvxActivity. Kita tambahkan attribut activity sebagai main launcer agar class ini diekseskusi sebagai main activity.

[Activity(Label = "Calculator", MainLauncher = true)]
public class CalculatorView : MvxActivity
{
public new CalculatorViewModel ViewModel
{
get { return (CalculatorViewModel)base.ViewModel; }
set { base.ViewModel = value; }
}

protected override void OnViewModelSet()
{
base.OnViewModelSet();
SetContentView(Resource.Layout.Calculator);
}
}

Kita running android project kita.mvvm_show.png

Selanjutnya kita  ganti nilai dari field pertama (binding : Operand1) dan kedua(binding: Operand2). Terlihat bahwa nilai field ketiga(binding:Result) nilainya merupakan nilai penambahan field pertama dan kedua.

mvvm_show1.png

1 komentar pada “MVVM Pattern in Xamarin Project using MvvmCross”

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s