2011-05-18 39 views
1

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

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

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

在此先感谢。

回答

0

我找到了答案,以我自己的问题,这真的很简单。拖动从数据源窗口的实体为用户控件自动生成的代码:

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编译(空引用)例外。问题解决了。

0

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

+0

我认为这会弄乱整个应用程序的当前DataContext。它现在基于正在更新的一个实体/表的ObservableCollection。此ObservableCollection被分配给CollectionViewSource的Source属性,该属性成为父窗口的DataContext。它也成为UserControls的继承的DataContext。虽然该父实体具有指向我的查找表的导航属性,但我不认为它可以(按原样)填充我的组合框的ItemsSource。我似乎需要两个(或更多)DataContexts! – DeveloperDan 2011-05-18 14:44:51

相关问题