Как передать ссылку на контейнер сущности (контекст) из родительского окна в дочерние элементы управления? - PullRequest
1 голос
/ 18 мая 2011

В моем приложении WPF есть элемент управления вкладками в главном (родительском) окне. Каждая вкладка содержит UserControl для удаления XAML и кода позади главного окна. Я использую методы перетаскивания и создания сущностей, описанные в этой статье Джули Лерман . Я не использую MVVM. Приложение выполняет операции CRUD на одной таблице / объекте. Несколько таблиц поиска / сущностей объединяются с первичной таблицей с использованием ссылок на внешний ключ. Родительское окно имеет переменную уровня класса _context, ссылающуюся на новый экземпляр моего контейнера сущностей, который я рассматриваю как соединение с базой данных (на стероидах). Как передать _context из главного окна в пользовательские элементы управления?

Создание свойства Context со ссылкой _context в родительском окне показалось хорошей идеей. Проблема в том, что разбивает мое родительское окно xaml. Он больше не компилируется, потому что я обращаюсь к Context в загруженном событии UserControl. Я предполагаю, что элемент управления скомпилирован перед родительским окном, вызывая исключение нулевой ссылки (от дочернего к родительскому Context) в главном окне xaml. Все работает нормально, если я просто создаю новую переменную _childContext в UserControl, но это похоже на подверженное ошибкам решение.

Моя причина для необходимости ссылки _context состоит в том, чтобы использовать ее для заполнения моих раскрывающихся списков поиска. Все связанные поля UserControl имеют свой DataContext, установленный в родительском окне. Родительский DataContext ссылается на одну сущность / таблицу, с которой выполняется CRUD. Этот DataContext не включает мои таблицы поиска. Вот почему я думаю, что мне нужна ссылка на _context, чтобы я мог использовать ее для генерации операторов LINQ внутри UserControl для заполнения моих списков поиска.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 18 мая 2011

Я нашел ответ на свой вопрос, и это действительно довольно просто. Перетаскивание объекта из окна Источники данных в UserControl автоматически генерирует этот код:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{            
     //Do not load your data at design time.
     if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
     {
        //Load your data here and assign the result to the CollectionViewSource.
        System.Windows.Data.CollectionViewSource myCollectionViewSource = (System.Windows.Data.CollectionViewSource)this.Resources["Resource Key for CollectionViewSource"];
        myCollectionViewSource.Source = your data
     }
}

Я понял, что проблема в том, что я закомментировал эти сгенерированные строки и не обернул мой код доступа к данным в это:

if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) {}.

Чтобы все работало, я вернулся к ссылке на свойство Context в родительском окне. Теперь мое событие UserControl_Loaded выглядит примерно так:

// Do not load your data at design time.
if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
    Window parentWindow = Window.GetWindow(this);
    MainWindow mainWindow = (MainWindow)parentWindow;
    MyEntities context = mainWindow.Context;

    var lookupList = from c in context.MyEntity
                     select c;

    System.Windows.Data.CollectionViewSource myEntitiesViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("myEntitiesViewSource")));
    // Load data by setting the CollectionViewSource.Source property:
    myEntitiesViewSource.Source = lookupList;

Проверка GetIsInDesignMode исправила исключение компиляции xaml (нулевая ссылка) в конструкторе MainWindow. Проблема решена.

0 голосов
/ 18 мая 2011

Если вы установите для родительского окна DataContext переменную _context, ваши дети автоматически наследуют его в свой DataContext. Затем просто измените привязку основных окон, указав ту часть вашего DataContext, которая его интересует, и попросите детей использовать ту часть, которая им интересна.

...