如何将父窗口中的实体容器(上下文)引用传递给子用户控件?

时间:2011-05-18 13:59:57

标签: wpf entity-framework user-controls binding

我的WPF应用程序在主(父)窗口中有一个选项卡控件。每个选项卡都包含一个UserControl,用于整理主窗口后面的xaml和代码。我正在使用this post by Julie Lerman中概述的实体框架拖放技术。我没有使用MVVM。该应用程序在单个表/实体上执行CRUD操作。使用外键引用将多个查找表/实体连接到主表。父窗口有一个类级别_context变量引用我的实体容器的新实例,我认为它是我的数据库连接(在类固醇上)。 如何将_context从主窗口传递给用户控件?

在父窗口上创建引用Context的{​​{1}}属性似乎是个好主意。问题是打破了我的父窗口xaml。它不再编译,因为我在UserControl的加载事件中访问_context。我猜测控件是在父窗口之前编译的,导致主窗口xaml中的空引用(从子窗口到父Context)异常。如果我只是在UserControl中创建一个新的Context变量,但这似乎是一个容易出错的解决方案,那么一切正常。

我需要_childContext引用的原因是使用它来填充我的下拉查找列表。所有绑定的UserControl字段都在父窗口中设置了DataContext。父DataContext引用正在执行CRUD的单个实体/表。此DataContext不包含我的查找表。这就是为什么我认为我需要对_context的引用,所以我可以使用它在UserControl中生成LINQ语句来填充我的查找列表。

提前致谢。

2 个答案:

答案 0 :(得分:0)

如果将父窗口DataContext设置为_context变量,则childlren将自动将其继承到其DataContext中。然后只需将主窗口绑定更改为指向其感兴趣的DataContext部分,让您的孩子使用他们感兴趣的部分。

答案 1 :(得分:0)

我找到了自己问题的答案,而且非常简单。将实体从“数据源”窗口拖动到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 检查更正了MainWindow设计器中的xaml compile(null reference)异常。问题解决了。