首頁 >後端開發 >C++ >為什麼我的 XAML 綁定不能在依賴屬性上工作,但可以在程式碼隱藏中工作?

為什麼我的 XAML 綁定不能在依賴屬性上工作,但可以在程式碼隱藏中工作?

Patricia Arquette
Patricia Arquette原創
2025-01-09 21:11:45499瀏覽

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

XAML 綁定在依賴屬性上失效

在 XAML 中,依賴屬性的資料綁定無效,但在程式碼隱藏中卻能正常運作。以下程式碼片段示範了這個問題:

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

依賴屬性定義如下:

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

在主視窗中,綁定到普通屬性可以完美工作:

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

但是,在使用者控制項中相同的綁定不會更新文字:

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

值得注意的是,在程式碼隱藏中實作綁定時,綁定可以正常運作:

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

解:

正確的依賴屬性聲明:

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

在 UserControl XAML 中進行綁定:

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

避免在 UserControl 建構子中設定 DataContext:

切勿在 UserControl 的建構子中設定 DataContext。這會阻止 UserControl 繼承其父級的 DataContext。

以上是為什麼我的 XAML 綁定不能在依賴屬性上工作,但可以在程式碼隱藏中工作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn