我有一个分配给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上刷新它。
答案 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