17


4

私はコントロールのXAMLが通常のように親のデータコンテキストから適切なプロパティにバインドできるユーザーコントロールを持っています(データコンテキストはxamlで伝播します)。

たとえば、DataContextがObjectAに設定されているウィンドウがあります。 ウィンドウ内の私のユーザーコントロールは、dataContext内のプロパティにアクセスしようとしています

したがって、私のウィンドウのxamlとその背後にあるコードはどちらもnull以外のDataContextを見ることができます。

DataContextが伝播する私のコントロールはXamlではnull以外のDataContextを見ることができますが、背後のコードでは見ることができません。

これを処理するための適切な方法は何ですか?

3 Answer


23


DataContextが設定されているかどうかを確認する必要がある場合は、DataContextChangedを使用できます。

パブリック部分クラスUserControl1:UserControl {public UserControl1(){InitializeComponent();}

DataContextChanged = new DependencyPropertyChangedEventHandler(UserControl1_DataContextChanged); }

void UserControl1_DataContextChanged(オブジェクトセンダ、DependencyPropertyChangedEventArgs e){//イベントargsを使ってDataContextに入るデータを検証することもできます}}

DataContextがnullから別の値に変更されるまで、UserControl1_DataContextChangedは入力されません。

これであなたの質問に答えることができるかどうかはわかりませんが、問題のデバッグに使用するのに非常に便利です。


12


UserControlのコンストラクタで 'DataContext’をチェックしていると思います。 実行がコンストラクターコード内にある間はユーザーコントロールがまだ作成されていないため、コンストラクターではnullになります。 ただし、Loadedイベントのプロパティを確認すると、オブジェクトが正しく表示されます。

パブリック部分クラスUserControl1 {public UserControl1(){this.InitializeComponent();}

//ここではDataContextはnullになります。this.Loaded = new RoutedEventHandler(UserControl1_Loaded); }

void UserControl1_Loaded(オブジェクトセンダ、RoutedEventArgs e){//ここでDataContextプロパティを確認 - 値がnullではない}}


10


実行時にバインディングエラーが発生していないか確認します。 この名前空間をXAMLに追加します。

xmlns:debug = "clrネームスペース:System.Diagnostics; assembly = System"

関連するエラーメッセージについては、デバッガの[出力]ウィンドウを確認してください。

あるいは、もっとコードを見せてもらえますか。