如何更改 ObservableCollection 中的数据

How to change data in ObservableCollection

如何在不向我的集合中添加或使用 add 的情况下更改我的 ObservableCollection 中的数据?

var items = await service.GetTrucksAsync();
foreach (var item in items)
{
    MyCollection.Add(new TruckItems
    {
        TruckId = item.TruckId,
        TruckQuoteId = item.QuoteId,
        TruckPhaseId = item.CurrentPhaseId,
        TruckChassisManufacturer = item.ChassisManufacturer,
        TruckChassisModel = item.ChassisModel,
        TruckStatus = item.Status,
        TruckJobNumber = item.JobNumbers,
        TruckAddedBy = item.AddedBy,
        TruckClientName = item.ClientName,
        TruckClientSurname = item.ClientSurname,
        TruckClientDetail = item.ClientDetail,
        TruckCurrentPhase = item.CurrentPhase
    });
}
dgViewProjects.ItemsSource = MyCollection;

我不想再次清除集合和添加数据,因为这会导致我的数据网格的 UI 变为 'flicker'(清除并再次加载新数据)。我需要它非常顺利。 :)

编辑:INotifyPropertyChanged 在我的 class

中实现
public class TruckItems : INotifyPropertyChanged
{
    ...
    public event PropertyChangedEventHandler PropertyChanged;
    void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }        
}

TruckItemsclass需要实现INotifyPropertyChanged接口。

例如:

public class TruckItems : INotifyPropertyChanged
{
    private int _truckQuoteId;

    public int TruckQuoteId
    {
        get { return _truckQuoteId; }
        set
        {
            if(value != _truckQuoteId)
            {
                value = _truckQuoteId;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TruckQuoteId));
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

如果您无法更改 TruckItems class (DAL),您需要创建一个新的 class 并复制属性。 (例如使用 Mapper


更新:

您面临的问题是,您正在创建 TruckItems.

的新实例
var items = await service.GetTrucksAsync();
foreach (var item in items)
{
    var truckItem = MyCollection.FirstOrDefault(i => i.TruckId == item.TruckId);

    bool isNew = false;

    if(truckItem == null)
    {
        truckItem = new TruckItems();
        isNew = true;
    }

    truckItem.TruckId = item.TruckId;
    truckItem.TruckQuoteId = item.QuoteId;
    truckItem.TruckPhaseId = item.CurrentPhaseId;
    truckItem.TruckChassisManufacturer = item.ChassisManufacturer;
    truckItem.TruckChassisModel = item.ChassisModel;
    truckItem.TruckStatus = item.Status;
    truckItem.TruckJobNumber = item.JobNumbers;
    truckItem.TruckAddedBy = item.AddedBy;
    truckItem.TruckClientName = item.ClientName;
    truckItem.TruckClientSurname = item.ClientSurname;
    truckItem.TruckClientDetail = item.ClientDetail;
    truckItem.TruckCurrentPhase = item.CurrentPhase;

    if(isNew )
       MyCollection.Add(truckItem);

}