ItemType というオブジェクトのコレクションがあり、それぞれに Item の子コレクションがあります。最上位のコレクションは ObservableCollection にラップされているため、ユーザーがコレクションに何かを追加または削除すると応答します。これは TreeView にバインドされているため、各 ItemType はその子アイテムを下に表示します。
私ができるようにしたいのは、フィルターを使用して、削除済みに設定されている子項目オブジェクトを取り除くことです。Filter にはブール述語が必要であり、もちろん最上位の ItemType のみが渡されるため、苦労しています。例:
public void UpdateObservableCollection()
{
QuoteItemTypesView = CollectionViewSource.GetDefaultView(QuoteItemTypes);
QuoteItemTypesView.Filter = FilterDeleted;
}
public bool FilterDeleted(object item)
{
ItemType it = item as ItemType; // only ItemType is ever passed in
if(it.IsDeleted)
{
return false;
}
return true;
}
下にある項目ではなく、ItemType を削除しているため、良くありません。
私はこれをやってみました:
public bool FilterDeleted(object item)
{
ItemType it = item as ItemType;
var itemsToRemove = new List<Item>();
foreach (Item i in it.Items)
{
if (i.IsDeleted)
{
itemsToRemove.Add(i);
}
}
foreach (var foo in meh)
{
it.Items.Remove(foo);
}
return true;
}
しかし、これは、実際のフィルターを実行するのではなく、基になるコレクションからアイテムを実際に削除することになります。
子コレクションをフィルタリングする方法はありますか?