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