Membandingkan UI berbasis peristiwa dengan UI terikat data
Antarmuka pengguna berbasis peristiwa (UI) dirancang di sekitar peristiwa yang diekspos kontrol. Peristiwa ini dapat dikaitkan dengan kode penanganan aktivitas yang dipanggil saat peristiwa dipicu. Misalnya, Anda memiliki tombol yang saat diklik melakukan operasi jangka panjang. Penanganan aktivitas yang ditetapkan ke Clicked
peristiwa dapat memulai operasi lalu mengatur properti tombol IsEnabled
ke false
, mencegah tombol diklik lagi saat operasi sedang berjalan.
UI terikat data menggunakan pengikatan data untuk menyajikan dan berinteraksi dengan data. Properti kontrol terikat ke properti objek data, dan pengikatan tersebut dapat mendeteksi perubahan dalam properti. Menggunakan contoh sebelumnya, pertimbangkan tombol yang melakukan operasi jangka panjang. Alih-alih menonaktifkan tombol di code-behind, IsEnabled
properti terikat ke properti objek IsBusy
data. Setiap kali objek data menjadi "sibuk" status tombol yang diaktifkan secara otomatis diubah agar cocok.
Pro dan kontra dalam menggunakan peristiwa dan kode di belakang
Menggunakan penanganan aktivitas kontrol dengan code-behind adalah cara cepat dan nyaman untuk merancang logika aplikasi untuk UI Anda. Anda menggunakan kode untuk memanggil layanan untuk mendapatkan data, melakukan operasi pada data tersebut, dan berinteraksi dengan kontrol di halaman. Kode digunakan untuk menjaga UI dan data tetap sinkron.
Pertimbangkan contoh aplikasi layanan cuaca. Fragmen XAML berikut berisi tombol UI sederhana yang dipilih pengguna untuk mendapatkan data terbaru dan memperbarui UI dengan kelembaban.
<VerticalStackLayout Margin="10">
<HorizontalStackLayout Spacing="20">
<Label Text="Postal Code:" VerticalOptions="Center" />
<Entry x:Name="PostalCode" WidthRequest="100" />
<Button x:Name="RefreshWeatherButton" Text="Refresh" WidthRequest="200" Clicked="RefreshWeatherButton_Clicked" />
</HorizontalStackLayout>
<Label x:Name="Humidity" Text="Humidity: ?" />
</VerticalStackLayout>
Ada tiga kontrol bernama dalam contoh ini:
Entry
kontrol bernama PostalCode.Button
kontrol bernama RefreshWeatherButton.Label
kontrol bernama Kelembaban.
memiliki RefreshWeatherButton
penanganan aktivitas yang dideklarasikan untuk peristiwa tersebut Clicked
. Ketika tombol diklik, penanganan aktivitas meminta layanan cuaca untuk prakiraan cuaca terbaru, menggunakan data yang dimasukkan dalam PostalCode
kontrol entri, dan mengatur Humidity
teks label ke kelembaban saat ini.
private void RefreshWeatherButton_Clicked(object sender, EventArgs e)
{
WeatherService.Location = PostalCode.Text;
WeatherService.Refresh();
Humidity.Text = $"Humidity: {WeatherService.Humidity}";
}
Dalam penanganan aktivitas yang satu ini, tiga kontrol digabungkan erat satu sama lain dan data melalui kode di belakang.
Desain ini berfungsi dengan baik untuk UI kecil, tetapi segera setelah UI menjadi kompleks, mempertahankan kode yang digabungkan erat di belakang dapat menjadi masalah. Jika Anda menghapus atau mengubah kontrol, Anda harus membersihkan kode apa pun menggunakan kontrol UI tersebut, yang dapat menyertakan penanganan aktivitas. Jika Anda memutuskan untuk mendesain ulang UI, Anda akan memiliki banyak kode untuk direfaktor juga. Dan ketika struktur data pendukung berubah, Anda harus menyelami kode setiap UI agar tetap sinkron.
Pengikatan data membantu
Pengikatan data dapat diimplementasikan dalam XAML atau kode, tetapi jauh lebih umum di XAML di mana mereka membantu mengurangi ukuran file code-behind. Dengan mengganti kode prosedural di penanganan aktivitas dengan kode deklaratif atau markup, aplikasi disederhanakan dan diklarifikasi. Karena pengikatan tidak memerlukan kode di belakang, Anda dapat dengan mudah membuat, mengubah, atau mendesain ulang UI agar sesuai dengan cara yang Anda inginkan untuk menyajikan data.
Mari kita ambil contoh yang sama seperti di bagian sebelumnya, tetapi perbarui untuk menggunakan pengikatan data:
<VerticalStackLayout Margin="10">
<HorizontalStackLayout Spacing="20">
<Label Text="Postal Code:" VerticalOptions="Center" />
<Entry Text="{Binding Location, Mode=OneWayToSource}" WidthRequest="100" />
<Button Text="Refresh" Command="{Binding RefreshWeather}" WidthRequest="200" />
</HorizontalStackLayout>
<Label Text="{Binding Humidity}" />
</VerticalStackLayout>
Anda dapat melihat properti yang terikat data, mereka menggunakan sintaks {Binding ...}
ekstensi XAML untuk nilai properti. Jangan khawatir tentang spesifikasinya, yang tercakup nanti dalam modul ini.
Tiga kontrol yang sama dideklarasikan dalam XAML, tetapi tidak satu pun dinamai, karena nama tidak diperlukan:
Entry
Kontrol:Properti kontrol
Text
ini terikat ke properti bernamaLocation
.Button
Kontrol:Properti tombol
Command
terikat ke properti bernamaRefreshWeather
.Command
adalah properti pada tombol yang memanggil kode saat tombol ditekan. Ini adalah alternatif untukClicked
peristiwa yang digunakan dalam pengikatan data.Label
Kontrol:Properti ini
Text
terikat ke properti bernamaHumidity
.
Dalam antarmuka pengguna sederhana ini, semua kode di belakang dihilangkan. Menghapus semua kode di belakang bukanlah titik pengikatan data, meskipun biasanya memungkinkan. Kode-belakang masih memiliki tempatnya. Berapa banyak pengikatan data yang Anda terapkan terserah Anda.
Sekarang UI digabungkan secara longgar ke objek data. Mengapa digabungkan secara longgar alih-alih digabungkan erat? Karena cara pengikatan dievaluasi. Setiap kontrol memiliki BindingContext
properti . Jika konteks tidak diatur, konteks kontrol induk digunakan, dan sebagainya, hingga akar XAML dievaluasi. Saat pengikatan dievaluasi, instans objek konteks diperiksa untuk properti yang diperlukan, seperti pengikatan kontrol Text
label ke properti konteks Humidity
. Jika Humidity
tidak ada pada konteks, tidak ada yang terjadi.
Karena UI digabungkan secara longgar, Anda dapat mendesain ulang UI tanpa khawatir melanggar kode. Namun, Anda dapat memutuskan fungsionalitas. Misalnya, Anda dapat menghapus tombol dan aplikasi masih mengkompilasi dan menjalankan, tetapi Anda tidak memiliki cara untuk menyegarkan cuaca. Di sisi lain, Anda dapat mengganti Entry
kontrol dan Button
dengan kontrol tunggal SearchBar
. Kontrol ini memungkinkan Anda memasukkan teks dan memanggil perintah.
<SearchBar Text="{Binding Location, Mode=OneWayToSource}" SearchCommand="{Binding RefreshWeather}" />
Seperti yang Anda lihat, menggunakan pengikatan data dalam desain UI Anda dapat membantu Anda berevolusi dan mengubah UI Anda tanpa banyak pekerjaan. Ini membuat UI tetap disinkronkan dengan data secara otomatis dan logika aplikasi dipisahkan dari UI.