更新一个列表<;T>;来自另一个列表<;T>;当数据发生变化时

本文关键字:gt lt 列表 数据 变化 另一个 更新 一个 | 更新日期: 2023-09-27 18:28:00

我已经在ViewModel中绑定了一个带有observaleCollection和选定Item的Listbox。

XAML:

<ListBox ItemsSource="{Binding CategoryLst}" 
         SelectedItem="{Binding SelectedCategory,Mode=TwoWay}"  />

C#:查看模型

private List<Category> _CategoryLst = new List<Category>();
private Category _SelectedCategory = new Category();
public List<Category> CategoryLst 
{
    get { return _CategoryLst ; }
    set
    {
        SetPropert(ref _CategoryLst , value);
    }
}
public Category SelectedCategory 
{
    get { return _SelectedCategory  ; }
    set
    {
        SetPropert(ref _SelectedCategory  , value);
    }
}

当我收到新的数据列表时,我只需要更新更改,以便在UI上反映相同的内容。目前,我只是将新数据分配给List,它会更新UI上的整个列表,因为在SetProperty:中实现了OnNotifyPropertyChanged

C#视图模型

CategoryLst = UpdatedCategoryLst;

这会导致UI上的闪烁,因为所选项目也绑定在UI上。我如何才能只更新列表中更新的元素,而不会因为完整的列表更新而引起闪烁?

更新一个列表<;T>;来自另一个列表<;T>;当数据发生变化时

首先,您提到您将ComboBox绑定到ObservableCollection<T>,而ViewModel显示您实际上绑定到了List<T>。尽管如此,您可以通过将集合本身设为只读并仅按项目更新"类别"来防止闪烁。要做到这一点,你当然需要一个CategoryId来将旧项目与更新项目关联起来:

// Called when updates takes place...
private void OnCategoryListUpdated()
{
    foreach (var updatedCategory in UpdatedCategoryList)
    {
        OnCategoryUpdated(updatedCategory);
    }
}
private void OnCategoryUpdated(Category updatedCategory)
{
    var oldCategoryInList = CategoryList.SingleOrDefault(c => c.Id == updatedCategory.Id);
    if (oldCategoryInList != null)
    {
        oldCategoryInList.PropertyA = updatedCategory.PropertyA;
        // Etc...
    }
}

如果类别也可以添加或删除,那么我建议您实际使用ObservableCollecton<T>,以便您的ComboBox在必要时自行更新,并且您还需要确保您的SelectedCategory保留在更新的集合中(或重置为null)。