19

我有一个用户控件,其中控件的 XAML 可以像正常一样绑定到父数据上下文中的适当属性(数据上下文在 xaml 中传播)。

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

所以我的窗口的 xaml 和后面的代码都可以看到一个非空的 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”。在构造函数中它将为空,因为在构造函数代码中执行时尚未创建用户控件。但是在 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 回答