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