【问题标题】:WPF User Control's DataContext is NullWPF 用户控件的 DataContext 为 Null
【发布时间】:2008-11-17 19:01:25
【问题描述】:

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

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

所以我的窗口的 xaml 和后面的代码都可以看到一个非空的 DataContext。

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

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

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:

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

    注意它不会进入 UserControl1_DataContextChanged,直到 DataContext 从 null 更改为不同的值。

    不确定这是否能回答您的问题,但可以非常方便地用于调试问题。

    【讨论】:

    • 我必须在 InitializeComponent 之前订阅 DataContextChanged 事件,以便在第一次设置 DataContext 时处理该事件。
    • 也可以做:DataContextChanged += UserControl1_DataContextChanged;
    【解决方案2】:

    我认为您正在检查 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
        }
    }
    

    【讨论】:

    • 不确定自此答案以来是否有任何变化 - 但 Loaded 事件的上下文为 NULL。
    • 在我的程序(.NET Framework 4.6.2)中,DataContext实际上是在InitializeComponent执行后初始化的。
    【解决方案3】:

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

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

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

    或者,您能否向我们展示更多代码?

    【讨论】:

    • 谢谢...这很甜蜜...我希望我在这几周前找到...哈哈。
    • 哦,好吧。也解决了我完全不相关的问题 :) 谢谢。
    • 教人钓鱼……我也不知道你能做到这一点。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多