Rumah > pembangunan bahagian belakang > C++ > Mengapa Pengikatan XAML Saya Tidak Berfungsi pada Harta Ketergantungan dalam Kawalan Pengguna WPF?

Mengapa Pengikatan XAML Saya Tidak Berfungsi pada Harta Ketergantungan dalam Kawalan Pengguna WPF?

Barbara Streisand
Lepaskan: 2025-01-09 21:08:43
asal
280 orang telah melayarinya

Why Doesn't My XAML Binding Work on a Dependency Property in a WPF User Control?

Kawalan Pengguna WPF: Isu Mengikat XAML dengan Sifat Ketergantungan

Mengikat pada sifat kebergantungan dalam XAML Kawalan Pengguna WPF boleh menjadi rumit. Mari kita periksa senario biasa:

Kawalan Pengguna dengan TextBlock:

<code class="language-xml"><UserControl ... x:Class="WpfTest.MyControl">
    <TextBlock Text="{Binding Test}" />
</UserControl></code>
Salin selepas log masuk

Harta Pergantungan dalam Kawalan Pengguna:

<code class="language-csharp">public static readonly DependencyProperty TestProperty =
    DependencyProperty.Register(
        "Test",
        typeof(string),
        typeof(MyControl),
        new PropertyMetadata("DEFAULT"));

public string Test
{
    get { return (string)GetValue(TestProperty); }
    set { SetValue(TestProperty, value); }
}</code>
Salin selepas log masuk

MainWindow ViewModel (atau DataContext):

<code class="language-csharp">private string _myText = "default";
public string MyText
{
    get { return _myText; }
    set { _myText = value; NotifyPropertyChanged(); }
}</code>
Salin selepas log masuk

Mengikat dalam MainWindow (Berjaya):

<code class="language-xml"><TextBlock Text="{Binding MyText}" /></code>
Salin selepas log masuk

Mengikat dalam Kawalan Pengguna (Gagal):

<code class="language-xml"><MyControl Test="{Binding MyText}" /></code>
Salin selepas log masuk

Pengikatan Kod Di Belakang (Berjaya):

<code class="language-csharp">TheControl.SetBinding(MyControl.TestProperty, new Binding
{
    Source = DataContext,
    Path = new PropertyPath("MyText"),
    Mode = BindingMode.TwoWay
});</code>
Salin selepas log masuk

Punca Punca:

Pengikatan XAML dalam Kawalan Pengguna gagal kerana sumber pengikatan tidak ditakrifkan secara eksplisit. Ia lalai kepada sifat Kawalan Pengguna sendiri.

Penyelesaian:

Nyatakan sumber pengikatan menggunakan RelativeSource:

<code class="language-xml"><UserControl ... x:Class="WpfTest.MyControl">
    <TextBlock Text="{Binding Test, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
</UserControl></code>
Salin selepas log masuk

Ini secara jelas memberitahu pengikatan untuk mencari moyang jenis UserControl untuk harta Test. Sebagai alternatif, anda boleh menggunakan AncestorType={x:Type Window} jika konteks data berada pada tahap Tetingkap.

Pertimbangan Utama:

  • Elakkan DataContext dalam Pembina Kawalan Pengguna: Menetapkan DataContext dalam pembina Kawalan Pengguna secara amnya tidak digalakkan dan boleh membawa kepada masalah yang mengikat.
  • Pengikatan Di Belakang Kod Eksplisit: Untuk pengikatan yang mantap, pertimbangkan untuk menetapkan pengikatan secara eksplisit dalam kod di belakang, seperti yang ditunjukkan di atas. Ini memberikan lebih kawalan dan kejelasan.

Dengan mengikuti garis panduan ini, anda boleh mengikat sifat pergantungan dengan pasti dalam Kawalan Pengguna WPF anda.

Atas ialah kandungan terperinci Mengapa Pengikatan XAML Saya Tidak Berfungsi pada Harta Ketergantungan dalam Kawalan Pengguna WPF?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan