依存関係プロパティのバインドは XAML では失敗しますが、分離コードでは正常に機能します。
TestProperty
依存関係プロパティの宣言に nameof()
演算子がないため、プロパティ名と XAML バインディング パスが不一致になります。 1. 依存関係属性を正しく宣言します
<code class="language-csharp">public static readonly DependencyProperty TestProperty = DependencyProperty.Register( nameof(Test), typeof(string), typeof(MyControl), new PropertyMetadata("DEFAULT"));</code>
2. XAML で Bindings.RelativeSource を設定します
<code class="language-xml"><TextBlock Text="{Binding Test, RelativeSource={RelativeSource AncestorType=UserControl}}"></TextBlock></code>
3. コンストラクター
内の DataContext 割り当てを削除します。UserControl コンストラクターからコードの DataContext = this;
行を削除します。
コードビハインドでバインディング ソースを明示的に設定します:
<code class="language-csharp">TheControl.SetBinding(MyControl.TestProperty, new Binding { Source = DataContext, ... });</code>
XAML でバインディング ソースを暗黙的に設定します:
<code class="language-xml"><MyControl Test="{Binding MyText}"></MyControl></code>
XAML では、暗黙的なバインディング ソースはデフォルトで現在の DataContext になり、親ウィンドウによって正しく設定される必要があります。 UserControl のコンストラクターで DataContext を設定すると、継承された DataContext が上書きされ、バインドが失敗します。 コードビハインド バインディングで Source = DataContext
を設定すると、バインディング ソースが継承された DataContext に明示的に設定され、バインディングが有効であることが保証されます。
以上がコードビハインドは機能するのに、依存関係プロパティへの XAML バインドが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。