将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立即做的事情。

将DataView加载到DataGrid会导致ShowDialog挂起

现在我们已经确定了数据量的问题:

  • 您打开了行和列虚拟化吗?您可以在数据网格
  • 上设置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);
    }
}