2

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;
}

しかし、これは、実際のフィルターを実行するのではなく、基になるコレクションからアイテムを実際に削除することになります。

子コレクションをフィルタリングする方法はありますか?

4

1 に答える 1

1

ItemTypeあなたが次のように宣言されていると仮定します

public class ItemType : INotifyPropertyChanged
{
    public string Name { get; set; // Raise property changed event }
    public string IsDeleted { get; set; // Raise property changed event }

    //// Other properties

    public List<ItemType> Children { get; set; }

    //// Filter based on provided perdicate
    public Node Search(Func<Node, bool> predicate)
    {
         if(this.Children == null || this.Children.Count == 0)
         {
             if (predicate(this))
                return this;
             else
                return null;
         }
         else 
         {
             var results = Children
                               .Select(i => i.Search(predicate))
                               .Where(i => i != null).ToList();

             if (results.Any()){
                var result = (Node)MemberwiseClone();
                result.Items = results;
                return result;
             }
             return null;
         }             
    }
}

次に、結果を次のようにフィルタリングできます。

public bool FilterDeleted(object item)
{
    ItemType it = item as ItemType; // only ItemType is ever passed in
    it = it.Search(x=> x.IsDeleted);
    return true;
} 
于 2015-11-23T18:02:27.113 に答える