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中文網其他相關文章!