Контекст данных пользовательского элемента управления WPF имеет значение NULL

У меня есть пользовательский элемент управления, в котором XAML элемента управления может связываться с соответствующими свойствами из родительского контекста данных, как обычно (контекст данных распространяется в xaml).

Например, у меня есть окно, для которого я устанавливаю DataContext, например, на ObjectA. Затем мой пользовательский элемент управления в окне пытается получить доступ к свойствам в dataContext

Таким образом, xaml моего окна и код позади могут видеть ненулевой DataContext.

Мой элемент управления, на который распространяется DataContext, может видеть ненулевой DataContext в Xaml, но не в коде позади.

Как правильно с этим справиться?


person Justin Bozonier    schedule 17.11.2008    source источник


Ответы (3)


в противном случае, если вам нужно проверить, установлен ли 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 не будет изменен с нуля на другое значение.

Не уверен, что это ответ на ваш вопрос, но может быть очень удобно использовать при отладке проблем.

person Bijington    schedule 18.11.2008
comment
Мне пришлось подписаться на событие DataContextChanged до InitializeComponent, чтобы я мог обработать событие при первой установке DataContext. - person Darlene; 09.10.2013
comment
Также работает: DataContextChanged + = UserControl1_DataContextChanged; - person Skychan; 13.05.2016

Я думаю, вы проверяете DataContext в конструкторе UserControl. В конструкторе он будет иметь значение 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
    }
}
person Jobi Joy    schedule 17.11.2008
comment
Не уверен, изменилось ли что-нибудь с момента этого ответа, но событие Loaded имеет контекст NULL. - person Pakk; 09.04.2016
comment
В моей программе (.NET Framework 4.6.2) DataContext фактически инициализируется после выполнения InitializeComponent. - person blearyeye; 20.12.2017

Я бы проверил, есть ли у вас ошибка привязки во время выполнения. Добавьте это пространство имен в свой XAML:

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

и проверьте окно вывода отладчика на наличие соответствующих сообщений об ошибках.

Или вы можете показать нам еще код?

person hughdbrown    schedule 16.02.2009
comment
Спасибо ... это мило ... Хотел бы я найти это несколько недель назад ... лол. - person Jason Stevenson; 05.05.2009
comment
Ну что ж. Решил и мою совершенно не связанную проблему :) Спасибо. - person BeardinaSuit; 20.12.2011
comment
Научи человека ловить рыбу ... Я тоже понятия не имел, что ты умеешь это делать. Спасибо. - person Jim; 07.04.2020