Пользовательский контроль WPF DataContext - Null
У меня есть пользовательский элемент управления, в котором XAML элемента управления может привязываться к соответствующим свойствам из родительского контекста данных, как обычно (контекст данных распространяется в xaml).
Например, у меня есть окно, для которого DataContext я устанавливаю ObjectA, например. Мой пользовательский контроль в окне затем пытается получить доступ к свойствам в dataContext
Итак, мое окно xaml и код позади могут видеть не нулевой DataContext.
Мое управление, которое распространяется DataContext, может видеть ненулевой DataContext в Xaml, но не в коде.
Каков правильный способ справиться с этим?
Ответы
Ответ 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 не будет изменен с нуля на другое значение.
Не уверен, что это отвечает на ваш вопрос, но может быть весьма удобным для использования в вопросах отладки.
Ответ 2
Я думаю, что вы проверяете "DataContext" в конструкторе UserControl. Он будет пустым в конструкторе, поскольку пользовательский элемент управления еще не создан, а выполнение - в коде конструктора. Но проверьте свойство на Loaded event, вы увидите объект правильно.
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
}
}
Ответ 3
Я бы посмотрел, есть ли у вас ошибка привязки во время выполнения. Добавьте это пространство имен в свой XAML:
xmlns:debug="clr-namespace:System.Diagnostics;assembly=System"
и проверьте окно вывода отладчика для соответствующих сообщений об ошибках.
В качестве альтернативы вы можете показать нам больше кода?