有没有办法将 DbSet<T> 传递到页面中?

Is there a way to pass the DbSet<T> into the page?

我有 window 页面。该页面显示来自我的数据库的数据。此外,在 window 上放置了按钮,其内容根据数据库的 table 名称。这些按钮切换页面的内容。

例如,这是btnUsers按钮的点击事件,显示“用户”table:

void btnUsers_Click(object sender, RoutedEventArgs e) {
    this.FrameMain.Navigate(new pageTable(Context.ctx.Users, ...));
}

pageTable 是我的“通用”页面,接收 Users class。这是它的构造函数,它不起作用:

public pageTable(dynamic table, ...) {
    InitializeComponent();

    TableTemplate<dynamic>.Init(table, ...);
}

这是我的通用 class,它在 DbSet<T>:

上运行
static class TableTemplate<T> {
    internal static void Init(T table) {
        foreach (string f in Foo(table, ...) {
            ...
        }
    }
}

Foo 方法只是从 DbSet<T> table:

中提取列
internal static string Foo<T>(T item, ...) {
    ...
}

关键是,当我尝试从 table 获取数据时,应用程序终止,在按钮的事件中,使用了这种通用方法。

我注意到,在 Foo 方法中,在调试期间,T 类型有所不同,具体取决于我传递 DbSet<T> 的方式:

是否可以将通用实体 class 传递到页面中?我不知道 XAML 是否有通用的 classes 支持,以使用通用的 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 class 的 Init 方法是下一个:

internal static void Init(List<T> tableList) {
    if (tableList.Count > 0) {
        foreach (string f in Foo(tableList[0], ...) {
            ...
        }
    }
}

如果 tableList 为空,我还没有弄清楚如何只显示 table 的列名。因此,在这种情况下,现在页面显示没有列名称的空 DataGrid。尽管如此,我还是很高兴,这就是我想要的。

最后,我要说的是,间接同意Xerillio