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"

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

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

Другие вопросы по тегам