将DataView加载到DataGrid会导致ShowDialog挂起
本文关键字:ShowDialog 挂起 DataGrid DataView 加载 | 更新日期: 2023-09-27 18:07:25
我有这个非常简单的代码:
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数据网格,所以也许我在这里做错了什么,但我真的不明白网格的错误如何阻止窗口显示,没有给我一个异常,实际上冻结了我的应用程序。
什么线索吗?如果有什么缺失,我很乐意提供更多的代码!
加载Excel工作簿116行x 47列的工作;我需要加载的文件有5000 +行x 47列-可能是WPF DataGrid 需要分页更大的数据集吗?WinForms的DataGridView没有问题,而且速度快得多,我认为它的WPF对应物会以类似的方式工作。所以问题是ShowDialog
正在等待数据网格加载数据。我认为它被挂起了,因为我没有想到WPF DataGrid要花一分钟的时间来做WinForms DataGridView立即做的事情。
现在我们已经确定了数据量的问题:
- 您打开了行和列虚拟化吗?您可以在数据网格 上设置EnableRowVirtualization=true
- 你使用自动大小列吗?重新计算每个新行/列的最佳大小可能是一个累加-尝试使用固定的列大小或比例(1*)大小。您可以尝试类似的方法与高度行。
试一下。我不确定这是否可行。我认为在main中加载Excel会导致问题或死锁。
var xlData = Excel8OleDbHelper.ImportExcelFile(fileName);
var viewModel = new MyViewModel(fileName);
_window = new MyWindow(viewModel);
_window.ShowDialog();
public class MyViewModel
{
public MyViewModel(string filename)
{
filename = filename;
}
private string _filename;
private DataTable _xlData;
public DataTable XlData
{
return _xlData ?? (_xlData = Excel8OleDbHelper.ImportExcelFile(fileName);
}
}