1

我有这个非常简单的代码:

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 立即执行的操作。

4

2 回答 2

1

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

  • 您是否打开了行和列虚拟化?您可以在数据网格上设置 EnableRowVirtualization=true
  • 您是否使用自动调整大小的列?为每个新行/列重新计算最佳大小可能是一个性能拖累 - 尝试使用固定列大小或比例 (1*) 大小。您可以尝试对行的高度使用类似的方法。
于 2013-04-06T04:52:07.680 回答
0

尝试这样做。我不确定这是否可行。我认为在 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);
    }
}
于 2013-04-05T07:14:17.503 回答