WPF用户控制';的DataContext为空

WPF用户控制';的DataContext为空,wpf,wpf-controls,Wpf,Wpf Controls,我有一个用户控件,控件的XAML可以像普通控件一样绑定到父级数据上下文中的相应属性(数据上下文在XAML中传播) 例如,我有一个窗口,我将其DataContext设置为ObjectA。然后,我的窗口中的用户控件将尝试访问dataContext中的属性 因此,我的窗口的xaml和代码隐藏都可以看到非空的DataContext DataContext传播到的控件可以在Xaml中看到非null DataContext,但在代码隐藏中看不到 处理此问题的正确方法是什么?我认为您正在检查UserContr

我有一个用户控件,控件的XAML可以像普通控件一样绑定到父级数据上下文中的相应属性(数据上下文在XAML中传播)

例如,我有一个窗口,我将其DataContext设置为ObjectA。然后,我的窗口中的用户控件将尝试访问dataContext中的属性

因此,我的窗口的xaml和代码隐藏都可以看到非空的DataContext

DataContext传播到的控件可以在Xaml中看到非null DataContext,但在代码隐藏中看不到


处理此问题的正确方法是什么?

我认为您正在检查UserControl构造函数中的“DataContext”。由于在构造函数代码中执行时尚未创建用户控件,因此在构造函数处它将为null。但是在加载事件时检查属性,您将正确地看到对象

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
    }
}

否则,如果需要检查是否正在设置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


不确定这是否回答了您的问题,但在调试问题中使用起来非常方便。

我会检查您在运行时是否有绑定错误。将此命名空间添加到XAML:

xmlns:debug="clr-namespace:System.Diagnostics;assembly=System"
并检查调试器的输出窗口中的相关错误消息


或者,您可以向我们展示更多代码吗?

谢谢您。。。这是甜蜜的。。。我希望我能在几周前找到这个。。。哈哈,好吧。也解决了我完全无关的问题:)谢谢。教一个人钓鱼。。。我也不知道你能做到这一点。谢谢。我必须在初始化组件之前订阅DataContextChanged事件,这样我才能在第一次设置DataContext时处理该事件。也可以这样做:DataContextChanged+=UserControl1_DataContextChanged;不确定此回答之后是否有任何更改-但加载的事件的上下文为NULL。在我的程序(.NET Framework 4.6.2)中,DataContext实际上是在InitializeComponent执行后初始化的。