19

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

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

したがって、私のウィンドウのxamlとコードビハインドは両方ともnull以外のDataContextを見ることができます。

DataContextが伝播する私のコントロールは、Xamlでnull以外のDataContextを確認できますが、コードビハインドでは確認できません。

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

4

3 に答える 3

26

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

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();

        DataContextChanged += new DependencyPropertyChangedEventHandler(UserControl1_DataContextChanged);
    }

    void UserControl1_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        // You can also validate the data going into the DataContext using the event args
    }
}

DataContext が null から別の値に変更されるまで、UserControl1_DataContextChanged に入らないことに注意してください。

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

于 2008-11-18T16:20:53.367 に答える
14

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

public partial class UserControl1
{
    public UserControl1()
    {
        this.InitializeComponent();

        //DataContext will be null here 
        this.Loaded += new RoutedEventHandler(UserControl1_Loaded);
    }

    void UserControl1_Loaded(object sender, RoutedEventArgs e)
    {
        //Check DataContext Property here - Value is not null
    }
}
于 2008-11-17T19:35:41.883 に答える
14

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

xmlns:debug="clr-namespace:System.Diagnostics;assembly=System"

デバッガーの [出力] ウィンドウで、関連するエラー メッセージを確認します。

または、もっとコードを見せてもらえますか?

于 2009-02-16T22:11:30.497 に答える