【问题标题】:Binding ObservableCollection take much time in fact the window take much time to be displayed绑定 ObservableCollection 需要很长时间实际上窗口需要很长时间才能显示
【发布时间】:2015-12-28 02:21:28
【问题描述】:

我正在使用带有 WPFMVVM light 框架,并且我有一个 DataGrid 包含从我的 SQLite 数据库加载的所有客户,但是显示窗口需要太多时间,所以如果有人可以帮助我,我可以单独显示窗口并加载 DataGrid。我认为由于 DataGrid 绑定,窗口需要时间。

 public ObservableCollection<CustumerModel> customerList
    {
        get
        {
            _customerList = new ObservableCollection<CustumerModel>();
            IList<CustumerModel> listCustomer = RemplireListCustomer();
            _customerList = new ObservableCollection<CustumerModel>(listCustomer);
            return _customerList;
        } 

RemplireListCustomer 方法

     private IList<CustumerModel> RemplireListCustomer()
    {
        IList<CustumerModel> listCustomer = new List<CustumerModel>();
        foreach (var c in _customerService.GetAllCustomers())
        {
            listCustomer.Add((CustumerModel)c);
        }
        return listCustomer;
    }

【问题讨论】:

  • 如果您通过展示您的代码来帮助我们,我们可以为您提供帮助。
  • 很有可能您有很多行要加载。所以在这种情况下你需要显示一些加载指示器,用于加载行的代码应该是异步的。
  • 希望代码更清楚
  • 首先,你需要实现一个自定义的 Observable 集合,它只在批量添加时发送一次 collectionchanged 事件。然后从你的数据网格打开垂直虚拟化
  • 为了缩小问题的范围,您可以暂时更改 RemplireListCustomer() 方法,使其不访问数据库,但添加一些静态内容作为 CustomerModel。如果更改后应用程序仍然很慢,您知道这与数据库访问无关。

标签: c# wpf mvvm datagrid mvvm-light


【解决方案1】:

您可以通过启动新的Task 来异步加载数据,例如你的类的构造函数。

public class YourClass
{
    public YourClass()
    {
        TaskEx.Run(() =>
        {
            var listCustomer = RemplireListCustomer();
            CustomerList = new ObservableCollection<CustumerModel>(listCustomer);
        });
    }

    public ObservableCollection<CustumerModel> CustomerList { get; private set; }
}

也许您不必使用foreach 遍历您的服务返回的所有客户,只需返回集合_customerService.GetAllCustomers()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2012-12-04
    • 2012-12-03
    相关资源
    最近更新 更多