WPFのTreeViewの要素を数える


WPFのTreeViewの要素を数え上げるのをぱっと見調べても見つからなかったので書く
まあ正確にはTreeViewにバインドしたやつの数をしっかり数え上げたんだけども
結構悩んだけど再帰に気づけばあっさり片付いた。

数える対象のクラス

まずはバインドしている数え上げの対象クラスの概要。
中に自分のリストを持つのが特徴。
自分の下がなければItemsはnullにしている。

public class TItem
{
~
public List<TItem> Items { get; set; }
}

実際の関数部分

refを使っているから隠す感じで2つの関数に分けた。
Itemsがnullになるまで再帰で潜るだけ。

public int TreeCount()
{
    int count = 0;
    this._TreeCount(this, ref count);
    return count;
}

private void _TreeCount(TItem item , ref int count)
{
    if (item.Items != null)
    {
        foreach (var i in item.Items)
            this._TreeCount(i, ref count);
    }
    count++;
}

再帰だと簡単だった。

実際に数える際には

実際にはTreeViewにバインドするのはTIemのコレクションなので
それをまとめて数え上げる。

上の関数2つをTItem内に入れてある場合は↓な感じでやって求める。

//実際にはバインドしている値なのでこの辺はイメージ
var TItems = new ObservableCollection<TItem>();
//欲しい値
var count = TItems.Sum(v => v.TreeCount());