Bagikan melalui


Gambaran umum deklarasi pengikatan (WPF .NET)

Biasanya, pengembang mendeklarasikan pengikatan langsung dalam markup XAML elemen UI yang ingin mereka ikat datanya. Namun, Anda juga dapat mendeklarasikan pengikatan dalam kode. Artikel ini menjelaskan cara mendeklarasikan pengikatan dalam XAML dan dalam kode.

Prasyarat

Sebelum membaca artikel ini, penting bahwa Anda terbiasa dengan konsep dan penggunaan ekstensi markup. Untuk informasi selengkapnya tentang ekstensi markup, lihat Ekstensi Markup dan WPF XAML.

Artikel ini tidak mencakup konsep pengikatan data. Untuk diskusi konsep pengikatan data, lihat Gambaran umum pengikatan data.

Mendeklarasikan pengikatan di XAML

Binding adalah ekstensi markup. Saat Anda menggunakan ekstensi pengikatan untuk mendeklarasikan pengikatan, deklarasi terdiri dari serangkaian klausul mengikuti Binding kata kunci dan dipisahkan oleh koma (,). Klausa dalam deklarasi pengikatan dapat dalam urutan apa pun dan ada banyak kemungkinan kombinasi. Klausa adalah pasangan Nilai Nama=, di mana Nama adalah nama Binding properti dan Nilai adalah nilai yang Anda tetapkan untuk properti tersebut.

Saat membuat string deklarasi pengikatan dalam markup, string tersebut harus dilampirkan ke properti dependensi tertentu dari objek target. Contoh berikut menunjukkan cara mengikat TextBox.Text properti menggunakan ekstensi pengikatan, menentukan Source properti dan Path .

<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=Name}"/>

Anda dapat menentukan sebagian besar properti kelas dengan Binding cara ini. Untuk informasi selengkapnya tentang ekstensi pengikatan dan untuk daftar Binding properti yang tidak dapat diatur menggunakan ekstensi pengikatan, lihat ringkasan Ekstensi Markup Pengikatan (.NET Framework ).

Sintaks elemen objek

Sintaks elemen objek adalah alternatif untuk membuat deklarasi pengikatan. Dalam kebanyakan kasus, tidak ada keuntungan khusus untuk menggunakan ekstensi markup atau sintaks elemen objek. Namun, ketika ekstensi markup tidak mendukung skenario Anda, seperti ketika nilai properti Anda adalah jenis non-string yang tidak ada konversi jenisnya, Anda perlu menggunakan sintaks elemen objek.

Bagian sebelumnya menunjukkan cara mengikat dengan ekstensi XAML. Contoh berikut menunjukkan melakukan pengikatan yang sama tetapi menggunakan sintaks elemen objek:

<TextBlock>
    <TextBlock.Text>
        <Binding Source="{StaticResource myDataSource}" Path="Name"/>
    </TextBlock.Text>
</TextBlock>

Untuk informasi selengkapnya tentang berbagai istilah, lihat Sintaks XAML Secara Rinci (.NET Framework).

MultiBinding dan PriorityBinding

MultiBinding dan PriorityBinding tidak mendukung sintaks ekstensi XAML. Itulah sebabnya Anda harus menggunakan sintaks elemen objek jika Anda mendeklarasikan MultiBinding atau PriorityBinding di XAML.

Membuat ikatan dalam kode

Cara lain untuk menentukan pengikatan adalah dengan mengatur properti langsung pada Binding objek dalam kode, lalu menetapkan pengikatan ke properti. Contoh berikut menunjukkan cara membuat Binding objek dalam kode.

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    // Make a new data source object
    var personDetails = new Person()
    {
        Name = "John",
        Birthdate = DateTime.Parse("2001-02-03")
    };

    // New binding object using the path of 'Name' for whatever source object is used
    var nameBindingObject = new Binding("Name");

    // Configure the binding
    nameBindingObject.Mode = BindingMode.OneWay;
    nameBindingObject.Source = personDetails;
    nameBindingObject.Converter = NameConverter.Instance;
    nameBindingObject.ConverterCulture = new CultureInfo("en-US");

    // Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
    BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject);
}
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)

    ' Make a new data source object
    Dim personDetails As New Person() With {
        .Name = "John",
        .Birthdate = Date.Parse("2001-02-03")
    }

    ' New binding object using the path of 'Name' for whatever source object is used
    Dim nameBindingObject As New Binding("Name")

    ' Configure the binding
    nameBindingObject.Mode = BindingMode.OneWay
    nameBindingObject.Source = personDetails
    nameBindingObject.Converter = NameConverter.Instance
    nameBindingObject.ConverterCulture = New CultureInfo("en-US")

    ' Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
    BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject)

End Sub

Kode sebelumnya mengatur yang berikut ini pada pengikatan:

  • Jalur properti pada objek sumber data.
  • Mode pengikatan.
  • Sumber data, dalam hal ini, instans objek sederhana yang mewakili seseorang.
  • Pengonversi opsional yang memproses nilai yang masuk dari objek sumber data sebelum ditetapkan ke properti target.

Ketika objek yang Anda ikat adalah FrameworkElement atau FrameworkContentElement, Anda dapat memanggil SetBinding metode pada objek Anda secara langsung alih-alih menggunakan BindingOperations.SetBinding. Misalnya, lihat Cara: Membuat Pengikatan dalam Kode.

Contoh sebelumnya menggunakan jenis objek data sederhana dari Person. Berikut ini adalah kode untuk objek tersebut:

class Person
{
    public string Name { get; set; }
    public DateTime Birthdate { get; set; }
}
Public Class Person

    Public Property Name As String
    Public Property Birthdate As DateTime
    
End Class

Sintaks jalur pengikatan

Path Gunakan properti untuk menentukan nilai sumber yang ingin Anda ikat:

  • Dalam kasus paling sederhana, Path nilai properti adalah nama properti objek sumber yang akan digunakan untuk pengikatan, seperti Path=PropertyName.

  • Subproperti properti dapat ditentukan oleh sintaks yang sama seperti dalam C#. Misalnya, klausa Path=ShoppingCart.Order mengatur pengikatan ke subproperti Order objek atau properti ShoppingCart.

  • Untuk mengikat properti terlampir, tempatkan tanda kurung di sekitar properti terlampir. Misalnya, untuk mengikat ke properti DockPanel.Dockterlampir , sintaksnya adalah Path=(DockPanel.Dock).

  • Pengindeks properti dapat ditentukan dalam tanda kurung siku mengikuti nama properti tempat pengindeks diterapkan. Misalnya, klausa Path=ShoppingCart[0] mengatur pengikatan ke indeks yang sesuai dengan bagaimana pengindeksan internal properti Anda menangani string harfiah "0". Pengindeks berlapis juga didukung.

  • Pengindeks dan subproperti dapat dicampur dalam Path klausul; misalnya, Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

  • Di dalam pengindeks. Anda dapat memiliki beberapa parameter pengindeks yang dipisahkan oleh koma (,). Jenis setiap parameter dapat ditentukan dengan tanda kurung. Misalnya, Anda dapat memiliki Path="[(sys:Int32)42,(sys:Int32)24]", di mana sys dipetakan ke System namespace layanan.

  • Ketika sumber adalah tampilan koleksi, item saat ini dapat ditentukan dengan garis miring (/). Misalnya, klausa Path=/ mengatur pengikatan ke item saat ini dalam tampilan. Ketika sumber adalah koleksi, sintaks ini menentukan item saat ini dari tampilan koleksi default.

  • Nama properti dan garis miring dapat dikombinasikan untuk melintasi properti yang merupakan koleksi. Misalnya, Path=/Offices/ManagerName menentukan item koleksi sumber saat ini, yang berisi Offices properti yang juga merupakan koleksi. Item saat ini adalah objek yang berisi ManagerName properti.

  • Secara opsional, jalur titik (.) dapat digunakan untuk mengikat ke sumber saat ini. Misalnya, Text="{Binding}" sama dengan Text="{Binding Path=.}".

Mekanisme pelepasan

  • Di dalam pengindeks ([ ]), karakter tanda sisipan (^) lolos dari karakter berikutnya.

  • Jika Anda mengatur Path di XAML, Anda juga perlu melarikan diri (menggunakan entitas XML) karakter tertentu yang khusus untuk definisi bahasa XML:

    • Gunakan &amp; untuk menghindari karakter "&".

    • Gunakan &gt; untuk menghindari tag akhir ">".

  • Selain itu, jika Anda menjelaskan seluruh pengikatan dalam atribut menggunakan sintaks ekstensi markup, Anda perlu mengeluarkan karakter (menggunakan garis miring \terbalik ) yang khusus untuk pengurai ekstensi markup WPF:

    • Garis miring terbelakang (\) adalah karakter escape itu sendiri.

    • Tanda sama dengan (=) memisahkan nama properti dari nilai properti.

    • Koma (,) memisahkan properti.

    • Kurung kurawal (}) yang tepat adalah akhir dari ekstensi markup.

Arah pengikatan

Binding.Mode Gunakan properti untuk menentukan arah pengikatan. Mode berikut adalah opsi yang tersedia untuk mengikat pembaruan:

Mode pengikatan Deskripsi
BindingMode.TwoWay Memperbarui properti target atau properti setiap kali properti target atau properti sumber berubah.
BindingMode.OneWay Memperbarui properti target hanya ketika properti sumber berubah.
BindingMode.OneTime Memperbarui properti target hanya ketika aplikasi dimulai atau ketika DataContext mengalami perubahan.
BindingMode.OneWayToSource Memperbarui properti sumber saat properti target berubah.
BindingMode.Default Menyebabkan nilai default Mode properti target digunakan.

Untuk informasi selengkapnya, lihat enumerasi BindingMode.

Contoh berikut menunjukkan cara mengatur Mode properti:

<TextBlock Name="IncomeText" Text="{Binding Path=TotalIncome, Mode=OneTime}" />

Untuk mendeteksi perubahan sumber (berlaku untuk pengikatan OneWay dan TwoWay), sumber harus menerapkan mekanisme pemberitahuan perubahan properti yang sesuai seperti INotifyPropertyChanged. Untuk informasi selengkapnya, lihat Menyediakan pemberitahuan perubahan.

Untuk TwoWay atau OneWayToSource pengikatan, Anda dapat mengontrol waktu pembaruan sumber dengan mengatur UpdateSourceTrigger properti . Untuk informasi selengkapnya, lihat UpdateSourceTrigger .

Perilaku default

Perilaku default adalah sebagai berikut jika tidak ditentukan dalam deklarasi:

  • Pengonversi default dibuat yang mencoba melakukan konversi jenis antara nilai sumber pengikatan dan nilai target pengikatan. Jika konversi tidak dapat dilakukan, pengonversi default mengembalikan null.

  • Jika Anda tidak mengatur ConverterCulture, mesin pengikatan menggunakan Language properti objek target pengikatan. Di XAML, ini default ke en-US atau mewarisi nilai dari elemen akar (atau elemen apa pun) halaman, jika telah ditetapkan secara eksplisit.

  • Selama pengikatan sudah memiliki konteks data (misalnya, konteks data yang diwariskan yang berasal dari elemen induk), dan item atau koleksi apa pun yang dikembalikan oleh konteks tersebut sesuai untuk pengikatan tanpa memerlukan modifikasi jalur lebih lanjut, deklarasi pengikatan tidak dapat memiliki klausul sama sekali: {Binding}. Ini seringkali merupakan cara pengikatan ditentukan untuk gaya data, di mana pengikatan bertindak atas koleksi. Untuk informasi selengkapnya, lihat Menggunakan Seluruh Objek sebagai Sumber Pengikatan.

  • Default Mode bervariasi antara satu arah dan dua arah tergantung pada properti dependensi yang terikat. Anda selalu dapat mendeklarasikan mode pengikatan secara eksplisit untuk memastikan bahwa pengikatan Anda memiliki perilaku yang diinginkan. Secara umum, properti kontrol yang dapat diedit pengguna, seperti TextBox.Text dan RangeBase.Value, default ke pengikatan dua arah, tetapi sebagian besar properti lainnya default ke pengikatan satu arah.

  • Nilai default UpdateSourceTrigger bervariasi antara PropertyChanged dan LostFocus tergantung pada properti dependensi terikat juga. Nilai default untuk sebagian besar properti dependensi adalah PropertyChanged, sementara TextBox.Text properti memiliki nilai LostFocusdefault .

Baca juga