[英]Is there a way to pass the DbSet<T> into the page?
我有頁面的窗口。 該頁面顯示來自我的數據庫的數據。 此外,在窗口上放置按鈕,其內容根據數據庫的表名稱。 這些按鈕切換頁面的內容。
例如,這是btnUsers
按鈕的點擊事件,它顯示“用戶”表:
void btnUsers_Click(object sender, RoutedEventArgs e) {
this.FrameMain.Navigate(new pageTable(Context.ctx.Users, ...));
}
pageTable
是我的“通用”頁面,它接收Users
類。 這是它的構造函數,它不起作用:
public pageTable(dynamic table, ...) {
InitializeComponent();
TableTemplate<dynamic>.Init(table, ...);
}
這是我的通用類,它在DbSet<T>
:
static class TableTemplate<T> {
internal static void Init(T table) {
foreach (string f in Foo(table, ...) {
...
}
}
}
Foo
方法只是從DbSet<T>
表中提取列:
internal static string Foo<T>(T item, ...) {
...
}
關鍵是,當我嘗試從表中獲取數據時,應用程序終止,在按鈕的事件中,使用了這種通用方法。
我注意到,在Foo
方法中,在調試期間, T
類型是不同的,具體取決於我傳遞DbSet<T>
:
如果我顯式初始化一個新的類實例(用於測試):
static class TableTemplate<T> { internal static void Init(T table) { foreach (string f in Foo(new Users(), ...) { ... } } }
,那么T
類型為System.Data.Entity.DynamicProxies.Users_E006B3...
, Foo
方法有效;
如果沒有顯式初始化, T
類型是System.Data.Entity.DbSet`1[Namespace.Users]
,並且Foo
方法不起作用。
是否有可能將通用實體類傳遞到頁面中? 我不知道 XAML 是否有通用類支持,以使用通用pageTable<T>
頁面。 這可能是一個解決方案,但我想有一種更簡潔的方法來傳遞實體。
我找到了解決方案,它不使用通用頁面。
好吧,當我嘗試打印table
內容時,我發現將結構化查詢傳遞給TableTemplate.Init()
。 我記得,以前從未使用dbContext.TableClass
作為函數參數,總是將TableClass
轉換為列表。
我承認,我不了解 EntityFramework 並且沒想到會出現這樣的結果。 一般我用的是object
類型,已經忘記為什么用dynamic
類型了...
我決定將轉換為列表的DbSet<T>
傳遞給頁面的構造函數,而不是DbSet<T>
。 但是,因為我不使用常規頁面,所以我將此列表的項目轉換為object
:
void btnUsers_Click(object sender, RoutedEventArgs e) {
this.FrameMain.Navigate(new pageTable(Context.ctx.Users.ToList<object>()));
}
現在, pageTable
頁面的構造函數是下一個:
public pageTable(List<object> table) {
InitializeComponent();
TableTemplate<object>.Init(table, ...);
}
並且,接下來是TableTemplate
類的Init
方法:
internal static void Init(List<T> tableList) {
if (tableList.Count > 0) {
foreach (string f in Foo(tableList[0], ...) {
...
}
}
}
如果tableList
為空,我還沒有弄清楚如何只顯示表的列名。 因此,在這種情況下,現在頁面顯示沒有列名稱的空DataGrid
。 盡管如此,我很高興,這可以做到我想要的。
最后,我要說,間接同意Xerillio 的觀點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.