ホームページ >バックエンド開発 >C++ >XAML バインドが WPF ユーザー コントロールの依存関係プロパティで機能しないのはなぜですか?

XAML バインドが WPF ユーザー コントロールの依存関係プロパティで機能しないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-09 21:08:43321ブラウズ

Why Doesn't My XAML Binding Work on a Dependency Property in a WPF User Control?

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>

MainWindow ViewModel (または DataContext):

<code class="language-csharp">private string _myText = "default";
public string MyText
{
    get { return _myText; }
    set { _myText = value; NotifyPropertyChanged(); }
}</code>

MainWindow でのバインド (成功):

<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 を回避する: ユーザー コントロールのコンストラクター内で DataContext を設定することは一般的に推奨されず、バインドの問題が発生する可能性があります。
  • 明示的な分離コード バインディング: 堅牢なバインディングを実現するには、上で示したように、分離コードで明示的にバインディングを設定することを検討してください。これにより、より詳細な制御と明確さが得られます。

これらのガイドラインに従うことで、WPF ユーザー コントロール内の依存関係プロパティに確実にバインドできます。

以上がXAML バインドが WPF ユーザー コントロールの依存関係プロパティで機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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