Rumah >pembangunan bahagian belakang >C++ >Mengapa Pengikatan XAML Saya Tidak Berfungsi pada Harta Ketergantungan, Tetapi Berfungsi dalam Code-Behind?

Mengapa Pengikatan XAML Saya Tidak Berfungsi pada Harta Ketergantungan, Tetapi Berfungsi dalam Code-Behind?

Patricia Arquette
Patricia Arquetteasal
2025-01-09 21:11:45552semak imbas

Why Doesn't My XAML Binding Work on a Dependency Property, But Works in Code-Behind?

Pengikatan XAML gagal pada sifat pergantungan

Pengikatan data untuk sifat pergantungan tidak mempunyai kesan dalam XAML, tetapi berfungsi dengan baik dalam kod belakang. Coretan kod berikut menunjukkan masalah:

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

Sifat kebergantungan ditakrifkan seperti berikut:

<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>

Dalam tetingkap utama, mengikat kepada sifat biasa berfungsi dengan sempurna:

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

Walau bagaimanapun, pengikatan yang sama dalam kawalan pengguna tidak mengemas kini teks:

<code class="language-xml"><MyControl Test="{Binding MyText}" x:Name="TheControl"/></code>

Perlu diperhatikan bahawa pengikatan berfungsi dengan baik apabila dilaksanakan dalam kod belakang:

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

Penyelesaian:

Perisytiharan sifat pergantungan yang betul:

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

Mengikat dalam UserControl XAML:

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

Elakkan daripada menetapkan DataContext dalam pembina UserControl:

Jangan sekali-kali tetapkan DataContext dalam pembina UserControl. Ini menghalang UserControl daripada mewarisi DataContext induknya.

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

Kenyataan:
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