【发布时间】:2012-05-01 13:04:46
【问题描述】:
我有一个常见问题,我想(希望)找到一个更好的解决方案来继续前进。我有一个包含数据主列表的 ObservableCollection。在我的客户端代码中,我需要将数据“转换”为新表单以显示给用户。我使用如下 LINQ 语句:
var newList = (from item in observable
select new { FirstInitial = item.Name[0] });
我知道这很简陋,但足以证明问题所在。 (注意投影,这不是一个简单的过滤器或分组语句。)然后我通过数据绑定在我的 UI 中显示 newList。
问题是,当原始集合发生变化时,UI 不会。到目前为止,我应用的解决方案是将事件处理程序附加到原始集合的 CollectionChanged 事件,该事件重新评估查询并更新绑定属性。
虽然这可以正常工作,但每次我遇到这种情况时都会重复很多代码。有没有办法让 LINQ 查询返回一个 ObservableCollection,当源 Observable 发生更改时“自动”更新?
换句话说,我想实现一些“固定”功能,以便在遇到这种情况时可以简单地重复使用它。
更新
感谢 Scroog1 帮助我看到我的原始帖子与 UI 过于耦合,无法满足我的真正要求。以下面的例子来更好地描述问题:
public class SomeClass
{
private ObservableCollection<Employee> _allEmployees;
private ObservableCollection<Employee> _currentEmployees;
public ObservableCollection<Employee> CurrentEmployees
{
get
{
if (_currentEmployees == null)
_currentEmployees = _allEmployees.Where(e => !e.IsTerminated);
return _currentEmployees;
}
}
}
public class SomeViewModel
{
private ICollectionView _view;
public ICollectionView CurrentView
{
if (_view == null)
{
var cvs = new CollectionViewSource()
{
Source = someClass.CurrentEmployees
}
cvs.Add(new SortDescription("Name", ListSortDirection.Ascending));
_view = cvs.View;
}
return _view;
}
}
如您所见,查询所在的代码并不是直接绑定到 UI 的。我使用这个例子来证明我是从更一般的用例而不是严格的 UI 数据绑定场景中询问的。
【问题讨论】:
标签: .net linq linq-to-objects observablecollection