2008-11-17 2 views
14

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

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

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

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

Каков правильный способ обращения с этим устройством?

ответ

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

Примечание это обыкновение вводить UserControl1_DataContextChanged до DataContext не изменяется от нуля на другое значение.

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

+1

Мне пришлось подписаться на событие DataContextChanged перед InitializeComponent, чтобы я мог обработать событие при первом установлении DataContext. – Darlene

+0

Также работает: DataContextChanged + = UserControl1_DataContextChanged; – Skychan

11

Я думаю, что вы проверяете «DataContext» в конструкторе UserControl. Он будет пустым в конструкторе, поскольку пользовательский элемент управления еще не создан, а выполнение - в коде конструктора. Но проверьте свойство в событии 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

noope. Я проверяю его в контексте класса. –

+0

Не уверен, что с этого ответа ничего не изменилось - но загруженное событие имеет контекст NULL. – Pakk

+0

В моей программе (.NET Framework 4.6.2) DataContext фактически инициализируется после выполнения InitializeComponent. – blearyeye

10

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

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

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

В качестве альтернативы, вы можете показать нам больше кода?

+1

Спасибо ... это мило ... Мне жаль, что я не нашел это несколько недель назад ... lol. –

+0

Спасибо, спасибо, спасибо .... день == сохранен –

+0

Рад, что это сильно изменилось. И спасибо за верх. – hughdbrown

Смежные вопросы