WPF 使用者控制項:XAML 與依賴屬性的綁定問題
綁定到 WPF 使用者控制項的 XAML 中的依賴屬性可能很棘手。 讓我們來看一個常見的場景:
使用 TextBlock 的使用者控制項:
<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>
主視窗視圖模型(或 DataContext):
<code class="language-csharp">private string _myText = "default"; public string MyText { get { return _myText; } set { _myText = value; NotifyPropertyChanged(); } }</code>
在主視窗中綁定(成功):
<code class="language-xml"><TextBlock Text="{Binding MyText}" /></code>
使用者控制項中的綁定(失敗):
<code class="language-xml"><MyControl Test="{Binding MyText}" /></code>
程式碼隱藏綁定(成功):
<code class="language-csharp">TheControl.SetBinding(MyControl.TestProperty, new Binding { Source = DataContext, Path = new PropertyPath("MyText"), Mode = BindingMode.TwoWay });</code>
根本原因:
使用者控制項中的 XAML 綁定失敗,因為未明確定義綁定來源。 它預設為使用者控制項自己的屬性。
解:
使用 RelativeSource
指定綁定來源:
<code class="language-xml"><UserControl ... x:Class="WpfTest.MyControl"> <TextBlock Text="{Binding Test, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" /> </UserControl></code>
這明確告訴綁定查找 UserControl
屬性的 Test
類型的祖先。 或者,如果資料上下文位於視窗級別,則可以使用 AncestorType={x:Type Window}
。
主要考慮因素:
DataContext
,這可能會導致綁定問題。 透過遵循這些準則,您可以可靠地綁定到 WPF 使用者控制項中的依賴項屬性。
以上是為什麼我的 XAML 綁定不適用於 WPF 使用者控制項中的依賴屬性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!