2008-11-17 127 views
14

我有一个用户控件,其中控件的XAML可以像正常情况(数据上下文在xaml中传播)一样绑定到来自父级数据上下文的相应属性。WPF用户控件的DataContext为空

例如,我有一个窗口,其DataContext我设置为ObjectA为例。然后,我在窗口中的用户控件尝试访问dataContext中的属性。因此,我的窗口的xaml和后面的代码都可以看到非空的DataContext。

DataContext传播给我的控件可以在Xaml中看到非空的DataContext,但在后面的代码中看不到。

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

回答

19

做不到这一点,如果你需要检查的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的从空转变为不同的值,它不会进入UserControl1_DataContextChanged。

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

11

我想你正在检查UserControl的构造函数中的'DataContext'。它将在构造函数中为空,因为用户控件尚未在构造函数代码中执行时创建。但请检查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 
    } 
} 
+0

不需要。我正在课堂上检查它。 – 2008-11-17 22:56:22

+0

不知道自此答案以来是否有任何更改 - 但Loaded事件的上下文为NULL。 – Pakk 2016-04-09 03:20:21

+0

在我的程序(.NET Framework 4.6.2)中,DataContext实际上是在InitializeComponent执行后初始化的。 – blearyeye 2017-12-20 20:39:11

10

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

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

并检查调试器的Output窗口中的相关错误消息。

另外,你能告诉我们更多的代码吗?