我如何合并两个可观察集合,只从新列表中获取新的和更改的项目,并将其添加到旧列表中
本文关键字:列表 获取 添加 项目 合并 何合并 两个 集合 观察 新列表 | 更新日期: 2023-09-27 18:02:42
我有一个WPF应用程序,它使用绑定到ObservableCollection的DataGrid元素:
ObservableCollection<Deployment> deployments = DataAccess.GetDeployments();
datagrid01.ItemsSource = deployments;
这是一个Deployment类。Deployment对象表示正在现场发生的Windows安装,因此像CurrentTime这样的东西经常更改。
class Deployment
{
public string UniqueID { get; set; }
public string ComputerName { get; set; }
public string IPAddress { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public string UserName { get; set; }
public string TaskSequenceName { get; set; }
public string MachineObjectOU { get; set; }
public DateTime? StartTime { get; set; }
public DateTime? CurrentTime { get; set; }
public string Status { get; set; }
}
我想定期更新DataGrid与任何改变这些对象,如CurrentTime或他们的状态。它们的Status在安装完成后变为3,如果它们处于错误状态则变为2。
所以,我可以在一个计时器上得到一个新的对象集合,但是什么是最好的方法来添加只有新的项目从这个新的集合到DataGrid,并改变现有的项目谁有一个更新的时间,或状态,或什么?
使用.Except()方法从ObservableCollection
中筛选条目newRecordings = recordings.Except(_recordingsHidden).ToList();
应该使用如下所示的方法来完成这项工作。它不替换deployments
集合中的现有项,而只是更新该项的属性。
为了更新UI, Deployment
类必须实现INotifyPropertyChanged
接口,并在属性值改变时引发PropertyChanged
。一个简单的解决方案是添加一个UpdateFrom(Deployment d)
方法,该方法更新所有属性,然后以null
作为属性名引发单个PropertyChanged事件(通知所有属性已经更改)。
using System.Linq;
...
private void UpdateDeployments(IEnumerable<Deployment> changedDeployments)
{
foreach (var changedDeployment in changedDeployments)
{
var deployment = deployments.FirstOrDefault(
d => d.UniqueID == changedDeployment.UniqueID);
if (deployment != null)
{
deployment.UpdateFrom(changedDeployment);
}
else
{
deployments.Add(changedDeployment);
}
}
}
将ObservableCollection<Deployment>
设置为属性,将Raise
设置为property change event
,使用INotifyPropertyChange
接口。然后,您可以将此属性绑定到xaml
本身的DataGrid
的itemsource
。因此,从UI
或Database
更改collection
,整个list
将自动刷新。