Bagikan melalui


Ekstensi Markup dengan Sumber Relatif

Menentukan properti sumber pengikatan , yang akan digunakan dalamEkstensi Markup Pengikatan , atau saat mengatur properti dari elemen yang dibuat di XAML.

Penggunaan Atribut XAML

<Binding RelativeSource="{RelativeSource modeEnumValue}" ... />

Penggunaan Atribut XAML (ditanamkan dalam ekstensi Binding)

<object property="{Binding RelativeSource={RelativeSource modeEnumValue} ...}" ... />

Penggunaan Elemen Objek XAML

<Binding>
  <Binding.RelativeSource>
    <RelativeSource Mode="modeEnumValue"/>
  </Binding.RelativeSource>
</Binding>

-atau-

<Binding>
  <Binding.RelativeSource>
    <RelativeSource
      Mode="FindAncestor"
      AncestorType="{x:Type typeName}"
      AncestorLevel="intLevel"
    />
  </Binding.RelativeSource>
</Binding>

Nilai XAML

Nilai Deskripsi
modeEnumValue Salah satu dari berikut ini:

- Token string Self; sesuai dengan RelativeSource seperti yang dibuat dengan properti Mode diatur ke Self.
- Token string TemplatedParent; sesuai dengan RelativeSource seperti yang dibuat dengan properti Mode diatur ke TemplatedParent.
- Token string PreviousData; sesuai dengan RelativeSource seperti yang dibuat dengan properti Mode diatur ke PreviousData.
- Lihat di bawah ini untuk informasi tentang mode FindAncestor.
FindAncestor String token FindAncestor. Menggunakan token ini memasuki mode di mana RelativeSource menentukan jenis leluhur dan secara opsional tingkat leluhur. Ini sesuai dengan RelativeSource yang dibuat dengan properti Mode disetel ke FindAncestor.
typeName Diperlukan untuk mode FindAncestor. Nama suatu jenis yang memenuhi properti AncestorType.
intLevel Opsional untuk mode FindAncestor. Tingkat leluhur (dievaluasi ke arah induk di pohon logis).

Komentar

{RelativeSource TemplatedParent} penggunaan pengikatan adalah teknik utama yang membahas konsep yang lebih besar dari pemisahan UI kontrol dan logika kontrol. Ini memungkinkan pengikatan dari dalam definisi templat ke induk templat (instans objek run time tempat templat diterapkan). Untuk kasus ini, Ekstensi Markup TemplateBinding sebenarnya merupakan singkatan dari ekspresi pengikatan berikut: . TemplateBinding atau penggunaan {RelativeSource TemplatedParent} keduanya hanya relevan dalam XAML yang menentukan templat. Untuk informasi selengkapnya, lihat TemplateBinding Markup Extension.

{RelativeSource FindAncestor} terutama digunakan dalam templat kontrol atau komposisi UI mandiri yang dapat diprediksi, untuk kasus di mana kontrol selalu diharapkan berada di pohon visual dari jenis leluhur tertentu. Misalnya, item dari kontrol item mungkin menggunakan penggunaan FindAncestor untuk mengikat ke properti dari kontrol item leluhur induk mereka. Atau, elemen yang merupakan bagian dari komposisi kontrol dalam templat dapat menggunakan pengikatan FindAncestor ke elemen induk dalam struktur komposisi yang sama.

Dalam sintaks elemen objek untuk mode FindAncestor yang ditampilkan di bagian Sintaks XAML, sintaks elemen objek kedua digunakan khusus untuk mode FindAncestor. mode FindAncestor memerlukan nilai AncestorType. Anda harus mengatur AncestorType sebagai atribut menggunakan x:Type Markup Extension referensi ke jenis nenek moyang yang akan dicari. Nilai AncestorType digunakan saat permintaan pengikatan diproses pada run-time.

Untuk mode FindAncestor, properti opsional AncestorLevel dapat membantu memisahkan pencarian leluhur dalam kasus di mana mungkin ada lebih dari satu leluhur dari jenis tersebut yang ada di pohon elemen.

Untuk informasi selengkapnya tentang cara menggunakan mode FindAncestor, lihat RelativeSource.

{RelativeSource Self} berguna untuk skenario di mana satu properti instans harus bergantung pada nilai properti lain dari instans yang sama, dan tidak ada hubungan properti dependensi umum (seperti paksaan) yang sudah ada di antara kedua properti tersebut. Meskipun jarang ada dua properti pada objek sehingga nilainya benar-benar identik (dan diketik secara identik), Anda juga dapat menerapkan parameter Converter ke pengikatan yang memiliki {RelativeSource Self}, dan menggunakan pengonversi untuk mengonversi antara jenis sumber dan target. Skenario lain untuk {RelativeSource Self} adalah sebagai bagian dari MultiDataTrigger.

Misalnya, XAML berikut mendefinisikan elemen Rectangle sedemikian rupa sehingga berapapun nilai yang dimasukkan untuk Width, Rectangle selalu persegi: <Rectangle Width="200" Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}" .../>

{RelativeSource PreviousData} berguna baik dalam templat data, atau dalam kasus di mana pengikatan menggunakan koleksi sebagai sumber data. Anda dapat menggunakan {RelativeSource PreviousData} untuk menyoroti hubungan antara item data yang berdekatan dalam koleksi. Teknik terkait adalah membuat MultiBinding antara item saat ini dan sebelumnya di sumber data, dan menggunakan pengonversi pada pengikatan tersebut untuk menentukan perbedaan antara dua item dan propertinya.

Dalam contoh berikut, TextBlock pertama dalam templat item menampilkan angka saat ini. Pengikatan TextBlock kedua adalah MultiBinding yang secara nominal memiliki dua konstituen Binding: rekaman saat ini, dan pengikatan yang sengaja menggunakan rekaman data sebelumnya dengan menggunakan {RelativeSource PreviousData}. Kemudian, pengonversi pada MultiBinding menghitung perbedaan dan mengembalikannya ke pengikatan.

<ListBox Name="fibolist">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding}"/>
            <TextBlock>, difference = </TextBlock>
                <TextBlock>
                    <TextBlock.Text>
                        <MultiBinding Converter="{StaticResource DiffConverter}">
                            <Binding/>
                            <Binding RelativeSource="{RelativeSource PreviousData}"/>
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Menjelaskan pengikatan data sebagai konsep tidak tercakup di sini, lihat Gambaran Umum Pengikatan Data .

Dalam implementasi prosesor WPF XAML, penanganan untuk ekstensi markup ini ditentukan oleh kelas RelativeSource.

RelativeSource adalah ekstensi markup. Ekstensi markup biasanya diimplementasikan ketika ada persyaratan untuk meloloskan nilai atribut menjadi selain nilai harfiah atau nama handler, dan persyaratannya lebih global daripada hanya menempatkan pengonversi jenis pada jenis atau properti tertentu. Semua ekstensi markup di XAML menggunakan karakter { dan } dalam sintaks atributnya, yang merupakan konvensi di mana prosesor XAML mengenali bahwa ekstensi markup harus memproses atribut. Untuk informasi selengkapnya, lihat Ekstensi Markup danWPF XAML .

Lihat juga