更新一个列表<;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上。我如何才能只更新列表中更新的元素,而不会因为完整的列表更新而引起闪烁?
首先,您提到您将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)。