我如何合并两个可观察集合,只从新列表中获取新的和更改的项目,并将其添加到旧列表中

本文关键字:列表 获取 添加 项目 合并 何合并 两个 集合 观察 新列表 | 更新日期: 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本身的DataGriditemsource。因此,从UIDatabase更改collection,整个list将自动刷新。