Пользовательский контроль 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"

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

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