先に進むためのより良い解決策を (うまくいけば) 見つけたいという共通の問題があります。データのマスター リストを含む ObservableCollection があります。私のクライアント コードでは、ユーザーに表示するために、データを新しい形式に「変換」する必要があります。次のような LINQ ステートメントを使用します。
var newList = (from item in observable
select new { FirstInitial = item.Name[0] });
私はそれがかなり初歩的であることを知っていますが、問題を実証するには十分です。(プロジェクションに注意してください。これは単純なフィルターまたはグループ化ステートメントではありません。) 次に、データ バインディングを介して UI に newList を表示します。
問題は、元のコレクションが変更されても、UI が変更されないことです。これまでに適用した解決策は、元のコレクションの CollectionChanged イベントにイベント ハンドラーをアタッチして、クエリを再評価し、バインドされたプロパティを更新することでした。
これは問題なく機能しますが、このシナリオに出くわすたびに多くのコードが繰り返されます。ソース Observable が変更されたときに「自動的に」更新される ObservableCollection を LINQ クエリで返す方法はありますか?
言い換えれば、このシナリオが発生したときにいつでも簡単に再利用できるように、いくつかの「定型化された」機能を実装したいと考えています。
アップデート
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 データ バインディング シナリオではなく、より一般的なユース ケースから質問していることを示します。