メインウィンドウでは、バックグラウンドの属性BrushTestを作成し、インターフェイスにバインド
1 < ウィンドウ×:クラス= "WpfApp8.MainWindow" 2つ のxmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3つ のxmlns:X = "http://schemas.microsoft.com/をWinFX / 2006 / XAML」 4つ のxmlns:D = "http://schemas.microsoft.com/expression/blend/2008" 5つ のxmlns:MC = "http://schemas.openxmlformats.org/markup-compatibility/2006" 6つ のxmlns:ローカル= "CLR名前空間:WpfApp8" 7 MC:無視可能= "D" 8 タイトル= "メインウィンドウ" 高さ= "450"幅= "800"X:名= "TheMainWindow" > 9 < グリッド> 10 < ローカル:UserControl1をBackgroundTest = " {バインディングBrushTest} " /> 11 </ グリッド> 12 </ ウィンドウ>
1 公共 部分 クラスメインウィンドウ:ウィンドウ 2 { 3 パブリックメインウィンドウ() 4 { 5 のInitializeComponent(); 6 BrushTest = Brushes.Red。 7 この .DataContextは= この; 8 } 10 公共の 静的 読み取り専用たDependencyProperty BrushTestProperty = DependencyProperty.Register( 11 " BrushTest "、typeof演算(たSolidColorBrush)、typeof演算(メインウィンドウ)新しい PropertyMetadata(デフォルト(SolidColorBrushの))); 13 公衆たSolidColorBrush BrushTest 14 { 15 GET { リターン(たSolidColorBrush)GetValueメソッド(BrushTestProperty)。} 16 セット{値の代入(BrushTestProperty、値)。} 17 } 18 }
そして、インターフェイスにBackgroundTest同じ属性、およびバインドを追加し、ウィンドウにユーザーコントロールを追加します。
1 < ユーザーコントロールX:クラス= "WpfApp8.UserControl1" 2つ のxmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3つ のxmlns:X = "http://schemas.microsoft.com/ WinFX / 2006 / XAML」 4つ のxmlns:MC = "http://schemas.openxmlformats.org/markup-compatibility/2006" 5つ のxmlns:D = "http://schemas.microsoft.com/expression/blend/2008" 6つ のxmlns:ローカル= "CLR名前空間:WpfApp8" 7 MC:無視可能= "D" 8 D:DesignHeight = "450"D:DesignWidth = "800"> 9 < グリッド背景= " {バインディングBackgroundTest} " > 10 </ グリッド> 11 </ ユーザーコントロール>
1 公共部分クラスのUserControl1:ユーザーコントロール 2 { 3 公共のUserControl1() 4 { 5 のInitializeComponent(); 6 this.DataContext =この; 7 } 8 パブリック静的読み取り専用たDependencyProperty BackgroundTestProperty = DependencyProperty.Register( 9 "BackgroundTest"、typeof演算(たSolidColorBrush)、typeof演算(UserControl1を)、新しいPropertyMetadata(デフォルト(たSolidColorBrush)))。 10 公衆たSolidColorBrush BackgroundTest 11 { 12 取得{戻り(たSolidColorBrush)GetValueメソッド(BackgroundTestProperty)。} 13 セット{値の代入(BackgroundTestProperty、値)。} 14 } 15 }
実行した後、異常な結合コンソール出力は、背景を設定し、有効になりません。
System.Windows.Dataエラー:40:BindingExpressionパスエラー: 'オブジェクト' '' のUserControl1' (名前= '')」に見つからない 'BrushTest' プロパティ。
BindingExpression:パス= BrushTest。DataItem = 'のUserControl1'(NAME = '')。ターゲット要素は、 'のUserControl1'(NAME = '')です。targetプロパティは、 'BackgroundTest'(タイプ 'のSolidColorBrush')であります
なぜ間違っていますか?
二つのビューは、ユーザーコントロールのDataContextを提供するので、UserControl1が設けられたメインウィンドウカバーコンテキストのコンテキスト内に設けられました。
ウィンドウ<ローカル:UserControl1をBackgroundTest =「{バインディングBrushTest}」/> BrushTestは、所与、ユーザーコントロール相関値のコンテキストで見つけることができない結合値
このような異常は、結合偶然か、簡単に発生します。
ウィンドウがDataContextの(それ自体またはViewModelに)設定されている場合、子コントロールものDataContextを設定します。興味深いことに、XAMLエディタで、使用整形は窓が配置されているコンテキスト・プロパティにリンクされています。
だから、子コントロールがのDataContextを設定する場合、次のプロパティに焦点を当てる必要があるかどうかは、バインディング、外部データを参照されます。
これは、指定されたデータソースに拘束されることができ、上記の子コントロールのDataContextの使用を減らすことを推奨しました。例えば:
1 < ユーザーコントロールX:クラス= "WpfApp8.UserControl1" 2つ のxmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3つ のxmlns:X = "http://schemas.microsoft.com/ WinFX / 2006 / XAML」 4つ のxmlns:MC = "http://schemas.openxmlformats.org/markup-compatibility/2006" 5つ のxmlns:D = "http://schemas.microsoft.com/expression/blend/2008" 6つ のxmlns:ローカル= "CLR名前空間:WpfApp8" 7 MC:無視可能= "D" 8 D:DesignHeight = "450"D:DesignWidth = "800"X:名= "TheUserControl" > 9 < グリッド背景= " {バインディングのElementName = TheUserControl、PATH = BackgroundTest} " > 10 </ グリッド> 11 </ ユーザーコントロール>