ホームページ >バックエンド開発 >C++ >コードビハインドは機能するのに、依存関係プロパティへの XAML バインドが失敗するのはなぜですか?

コードビハインドは機能するのに、依存関係プロパティへの XAML バインドが失敗するのはなぜですか?

DDD
DDDオリジナル
2025-01-09 20:52:43543ブラウズ

Why Is My XAML Binding to a Dependency Property Failing, But Code-Behind Works?

XAML バインディング依存関係プロパティが失敗しました

質問

依存関係プロパティのバインドは XAML では失敗しますが、分離コードでは正常に機能します。

理由

  1. 依存関係プロパティ宣言エラー: TestProperty 依存関係プロパティの宣言に nameof() 演算子がないため、プロパティ名と XAML バインディング パスが不一致になります。
  2. XAML のバインディング ソース エラー: バインディング ソース (DataContext) は XAML バインディングで明示的に設定されていないため、親ウィンドウから継承された DataContext ではなく、UserControl 自体がデフォルトになります。
  3. コンストラクターで DataContext を設定します: UserControl のコンストラクターで DataContext プロパティを設定すると、親の DataContext の継承が妨げられ、バインディング ソースが無効になります。

解決策

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。