我已经使用observablecollection绑定了一个Listbox,并在我的ViewModel中选择了Item。
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,并且由于在SetProperty中实现了OnNotifyPropertyChanged,它会更新UI上的整个列表:
C#查看模型
CategoryLst = UpdatedCategoryLst;
这会导致UI上的闪烁,因为所选项目也会在UI上绑定。如何只更新列表中更新的那些元素,而不会因完整的列表更新而导致闪烁?
答案 0 :(得分:1)
首先,您提到将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 )。