数据更改时,从另一个List <t>更新一个List <t> </t> </t>

时间:2014-10-27 10:32:38

标签: c# wpf xaml windows-phone-8 inotifypropertychanged

我已经使用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上绑定。如何只更新列表中更新的那些元素,而不会因完整的列表更新而导致闪烁?

1 个答案:

答案 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 )。