【问题标题】:WPF, MVVM: lag between the moment OnPropertyChanged is fired and UI refreshWPF、MVVM:在 OnPropertyChanged 被触发和 UI 刷新之间的延迟
【发布时间】:2018-11-16 11:52:44
【问题描述】:

我已经实现了一个普通的 MVVM 应用程序。我有一个绑定到ObservableCollection 的数据网格。刷新数据库时,更新集合,OnPropertyChanged 被正确触发,但在 UI 正确刷新之前存在延迟。我可以说,因为当我调试时,我可以看到在触发OnPropertyChanged 和调用ObservableCollectionget 访问器之间有几秒钟的时间。滞后似乎与行数无关(即5或50行,似乎存在相同的滞后)。

我可以从哪里开始找出这种滞后来自哪里?

代码: 它是普通的 MVVM,因此:

private ObservableCollection<MyVar> _MyVars;
/// <summary>
/// List of pnl
/// </summary>
public ObservableCollection<MyVar> MyVars
{
    get
    {
        return _MyVars;
    }
    set
    {
        _MyVars = value;
        OnPropertyChanged("MyVars");
    }
}

ObservableCollection MyVars 是通过调用数据库来设置的。基本上正在发生的事情是调用OnPropertyChanged("MyVars"); 和调用return _MyVars; 之间的滞后。 MyVars 是数据网格的项目源。 在发布和调试中,数据网格需要几秒钟来刷新,我发现我上面提到的两个调用之间存在延迟。我不能放更多的代码,我只是想知道如果有人有同样的情况,他/她采取了哪条路径来调试和解决问题。

谢谢,

皮埃尔

【问题讨论】:

  • 您能否发布一些代码供我们查看,否则会做出假设,可能会导致您走错路。
  • 在调试过程中会发生很多事情,因此它可能无法代表应用程序的实际发布版本中发生的情况。在没有调试器的情况下运行它也会有延迟吗?

标签: wpf mvvm inotifypropertychanged


【解决方案1】:

为什么要重新分配 ObservableCollection 属性?只需创建一次并根据需要添加/删除项目。

private ObservableCollection<MyVar> _myVarsCollection = new ObservableCollection<MyVar>();

public IEnumerable<MyVar> MyVars => _myVarsCollection;

public void AddMyVar(MyVar myVar)
{
    _myVarsCollection.Add(myVar);
}

public void AddMyVars(IEnumerable<MyVar> myVars)
{
    foreach(var myvar in myVars)
        AddMyVar(myvar);        
}

public void RemoveMyVar(MyVar myVar)
{
    _myVarsCollection.Remove(myVar);
}

即使 _myVarsCollection 不是公共的,任何绑定到 MyVars 的控件都会检测到它实现了 INotifyCollectionChanged,并会在添加/删除项目时做出相应的反应。

【讨论】:

  • 我在想这相当于添加/删除项目或重新分配整个集合。谢谢,我会试试的。
  • 非常感谢!这个实现奏效了。我仍然没有得到我的解决方案和你的解决方案之间的差异问题。非常感谢您对某些文档的任何见解。
  • 如果刷新列表属性,则绑定控件必须完全重新创建并重新绘制每个项目的所有控件 - 这可能是您滞后的一个好方法。如果您只是向 ObservableCollection 添加新项目,那么要做的工作就会少得多。
猜你喜欢
  • 2019-05-26
  • 2011-02-22
  • 1970-01-01
  • 2012-06-24
  • 2012-09-23
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 2011-11-06
相关资源
最近更新 更多