如何刷新MVF ListView中的ListItem,MVVM中的CollectionViewSource

时间:2010-07-21 17:46:33

标签: c# wpf listview mvvm

我有一个分配给People的ObservableCollection 并有一个PersonViewModel 和PeopleViewModel

_people = GetAll().ToList();
List<PersonViewModel> allPeople = (from person in _people 
                                   select new PersonViewModel(person)).ToList();
AllPeople = new ObservableCollection<WorkOrderListItemViewModel>(allOrders);
AllPeopleCollection.Source = AllPeople;

其中
AllPeopleCollection是CollectionViewSource类型的公共属性,而AllPeople是ObservableCollection类型的公共属性

我需要在点击该项目时更改列表视图中用于行的图标。 但是要更新视图,我需要再次阅读整个列表。由于我的列表有100多条记录,因此刷新列表需要很长时间。

有没有办法只能刷新列表中的特定项目并在UI上刷新它。

2 个答案:

答案 0 :(得分:3)

,您的PersonViewModel应该实现INotifyPropertyChanged并在icon属性的setter中引发PropertyChanged事件(因此每次更新后都会自动引发)。如果绑定正确,这将触发GUI的刷新。

代码:

public class PersonViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private YourIconType _Icon;
    public YourIconType Icon
    {
        get { return _Icon; }
        set
        {
            _Icon = value;
            if (PropertyChanged != null)
                PropertyChanged.Invoke(this, 
                    new PropertyChangedEventArgs("Icon"));
        }
    }
}

答案 1 :(得分:0)

首先,你的记录计数实际上并没有在wpf的ListView前面,因为它使用了VirtualizingStackPanel。

除了PropertyChange Notification的确切解决方案之外,您还应该考虑查看deferred execution的概念。您似乎将所有内容转换为一个列表,这将导致立即强制枚举结果集。

让我们考虑您的代码:

_people= GetAll().ToList();  
//The result of GetAll is enumerated and a solid list is created

List<Person> allPeople = (from person in _people 
                          select new PersonViewModel(person)).ToList(); 
// another list created

AllPeople = new ObservableCollection<PersonViewModel>(allPeople); 
// ObservableCollection created out of list

让我们稍微调整一下:

_people= GetAll(); // The result is just referred by _people

IEnumerable<Person> allPeople = (from person in _people 
                                 select new PersonViewModel(person)); 
// IEnumerable is just provided with a query. No other operation is done

AllPeople = new ObservableCollection<PersonViewModel>(allPeople); 
// The ObservableCollection requests element from allPeople 
// which in turn requests from the query 
// which in turn requests from _people 
// which enumerates the result of GetAll() and yields the result. 

因此,您可以避免创建临时列表。

此外,即使GetAll()方法可以返回IEnumerable,如果不这样做。

您可以查看
IEnumerable
IQueryable
yield