2011-05-18 40 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

相關問題