【发布时间】:2013-04-05 05:53:49
【问题描述】:
我有这个非常简单的代码:
var xlData = Excel8OleDbHelper.ImportExcelFile(fileName);
var viewModel = new MyViewModel(xlData);
_window = new MyWindow(viewModel);
_window.ShowDialog();
Excel8OleDbHelper.ImportExcelFile()方法有效,调试时可以查看DataTable的内容。问题是_window 根本没有出现,线程的行为就好像它出现了一样(即它正在等待关闭未显示的窗口)。
如果我为此更改代码:
var viewModel = new MyViewModel(new DataTable());
_window = new MyWindow(viewModel);
_window.ShowDialog();
然后窗口出现,但当然是一个空的网格。
网格的 XAML:
<DataGrid x:Name="MyGrid" Margin="4"
IsReadOnly="True" SelectionUnit="Cell"
ItemsSource="{Binding Path=GridSource}" />
以及 ViewModel 的构造函数:
public DataView GridSource { get; private set; }
public MyViewModel(DataTable dataSource)
{
GridSource = dataSource.DefaultView;
}
这是我第一次使用 WPF 数据网格,所以也许我在这里做错了,但我真的不明白网格的问题会如何阻止窗口出现,而没有给我一个异常并实际上冻结了我的应用程序。
有什么线索吗?如果有任何遗漏,我很乐意提供更多代码!
更新
加载 116 行 x 47 列的 Excel 工作簿有效;我需要加载的文件有 5,000+ 行 x 47 列 - 可能是 WPF DataGrid 需要 对更大的数据集进行分页吗? WinForms DataGridView 没有问题,而且速度更快,我认为它的 WPF 对应物会以类似的方式工作。所以问题是ShowDialog 正在等待数据网格加载数据。我认为它已挂起,因为我没想到 WPF DataGrid 会花费一分钟以上的时间来完成 WinForms DataGridView 立即执行的操作。
【问题讨论】:
-
如果您完全注释掉 ItemsSource 绑定,该示例是否有效?我想不出任何答案,因为您似乎正在按照应有的方式做每一件事。
-
你能把
Excel8OleDbHelper.ImportExcelFile(fileName)用一些低容量的固定数据存根吗?只是为了消除问题中的 Excel 部分。 -
我认为加载 excel 在这里引起了问题。更改您的代码,提供您的视图模型文件名,并且视图模型使用 excel 帮助器。
-
@Gishu 我将尝试使用不同的较小文件,但完全相同的代码在 WinForms 下完美运行(好吧略有不同,正在实例化 form 而不是 window),将数据加载到 DataGridView 中。 @FaisalHafeez 实际上加载文件不是 ViewModel 的责任,除了 Excel 工作簿在
ShowDialog被调用的那一刻早就关闭了......但无论如何感谢您的时间! -
@Gishu 问题确实出在数据集的大小上;查看更新 - 我现在需要弄清楚 WPF DataGrid 分页 :)
标签: c# wpf wpfdatagrid