Я нашел ответ на свой вопрос, и это действительно довольно просто. Перетаскивание объекта из окна Источники данных в 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. Проблема решена.