異常な結合をもたらす、望ましくないのDataContextを提供することによって、WPF

オリジナル: 異常な結合が得られ、DataContextのを設定してWPFは望ましくないため、

メインウィンドウでは、バックグラウンドの属性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  </ ユーザーコントロール>
コードをコピー

 

おすすめ

転載: www.cnblogs.com/lonelyxmas/p/11978454.html