WPF、MVVM:触发 OnPropertyChanged 和 UI 刷新之间存在延迟
WPF, MVVM: lag between the moment OnPropertyChanged is fired and UI refresh
我已经实现了一个普通的 MVVM 应用程序。我有一个绑定到 ObservableCollection
的数据网格。刷新数据库时,更新集合,正确触发 OnPropertyChanged
但在正确刷新 UI 之前存在滞后。我可以这么说,因为当我调试时,我可以看到在触发 OnPropertyChanged
和调用 ObservableCollection
的 get
访问器之间有几秒钟的时间。延迟似乎与行数无关(即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
是数据网格的项目源。
在发布和调试中,数据网格需要几秒钟来刷新,我发现延迟出现在我上面提到的两个调用之间。我不能再写更多的代码了,我只是想知道是否有人有同样的情况,he/she 采取了哪条路径来调试和解决问题。
谢谢,
皮埃尔
为什么要重新分配 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 不是 public,任何绑定到 MyVars 的控件都会检测到它实现了 INotifyCollectionChanged,并会在添加/删除项目时做出相应反应。
我已经实现了一个普通的 MVVM 应用程序。我有一个绑定到 ObservableCollection
的数据网格。刷新数据库时,更新集合,正确触发 OnPropertyChanged
但在正确刷新 UI 之前存在滞后。我可以这么说,因为当我调试时,我可以看到在触发 OnPropertyChanged
和调用 ObservableCollection
的 get
访问器之间有几秒钟的时间。延迟似乎与行数无关(即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
是数据网格的项目源。
在发布和调试中,数据网格需要几秒钟来刷新,我发现延迟出现在我上面提到的两个调用之间。我不能再写更多的代码了,我只是想知道是否有人有同样的情况,he/she 采取了哪条路径来调试和解决问题。
谢谢,
皮埃尔
为什么要重新分配 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 不是 public,任何绑定到 MyVars 的控件都会检测到它实现了 INotifyCollectionChanged,并会在添加/删除项目时做出相应反应。