使用Linq搜索listview项目

时间:2012-11-21 18:31:57

标签: wpf linq listview binding

我有一个listview绑定到Entity对象的集合视图(称为Message)

当Message Objects集合发生更改(dispatchertimer)时,将触发listview项绑定刷新。

发生这种情况时,将取消选择列表视图中当前选定的项目。

如何在listview项集合上进行LINQ搜索以查找某个id的消息对象并重新选择它?

int id = ((Message)lvMessages.SelectedItem).Id;

lvMessages.DataContext = service.Messages;
ICollectionView view = CollectionViewSource.GetDefaultView(lvMessages.ItemsSource);
view.Filter = new Predicate<object>(FilterMessageItem);

//var li = lvMessages.Items.Cast<Message>().Where(m => m.Id == id).SingleOrDefault();

lvMessages.SelectedItem = li;

我不确定如何设置Linq查询,因为我在注释行上收到此错误...

  

无法隐式转换类型   System.Collections.Generic.IEnumerable'到   'BusinessObjects.Message'。存在显式转换(是你   错过演员?)

也许有更好的方法来使用集合中更改的项目填充列表视图?不确定。

1 个答案:

答案 0 :(得分:0)

简短的回答是“你没有”。

如果您已将Listview的ItemSource绑定到ViewModel上的集合,则在ViewModel上为所选项创建一个属性(DependencyProperty或带有INotifyPropertyChanged的POCO)并将Listview的SelectedItem属性绑定到该属性。

当您在Listview中选择一个项目时,将更新此属性值,并使用该属性更改ViewModel中的值将更新Listview中的选择。使用MVVM和绑定,实际上不需要从ViewModel或其他任何地方访问视图控件等,包括代码隐藏。