5

この(非常に良い) 記事で説明されているように、WPF ロード オン デマンド ツリービューを実装しました。上記のソリューションでは、ダミー要素を使用して、展開+アイコン/ツリービュー アイテムの動作を保持しています。ユーザーがエキスパンダーをクリックすると、ダミー項目が実際のデータに置き換えられます。

public bool HasChildren { get { ... } }プロパティをバッキングに追加して、モデルを改良したいと考えていますTreeNodeViewModel

質問:
このプロパティをバインドして、(XAML で) 展開アイコンを表示/非表示にするにはどうすればよいですか? 適切なトリガー/セッターの組み合わせが見つかりません。
(INotifyPropertyChanged は適切に実装されています。)

御時間ありがとうございます。

更新 1:ダミー要素を使用する代わり
に 、プロパティを使用したい。 項目に子があるかどうかを判断するのは多少コストがかかりますが、それでも子をフェッチするよりははるかに安価です。public bool HasChildren

4

2 に答える 2

1

Joshのコードをすばやく調べた後、次のコンストラクターを見つけました。

protected TreeViewItemViewModel(TreeViewItemViewModel parent, bool lazyLoadChildren)
{
    _parent = parent;

    _children = new ObservableCollection<TreeViewItemViewModel>();

    if (lazyLoadChildren)
        _children.Add(DummyChild);
}

したがって、継承するViewModelクラスからパラメーターを渡す場合falselazyLoadChildrenDummyChildが追加されないため、+アイコンは表示されません。あなたはあなたのアイテムが子供を持っているかどうかを知っているように見えるので、あなたはlazyLoadChildrenプロパティの適切な値を渡すことができるはずです。それとも私は何かが足りないのですか?

于 2010-04-19T15:57:14.170 に答える
1

ジュリアン

これは本当に良い質問です。独自のツリー ビュー アイテムを作成してみませんか? :)つまり、最初からではなく、既存の TreeViewItem から派生させて、プロパティを追加するだけです。簡単なサンプルを用意しましたが、必要に応じて自由に変更してください (完全に明確でない場合は質問してください)。さあ行こう:

public class TreeViewItem_CustomControl : TreeViewItem
{
    static TreeViewItem_CustomControl()
    {
        HasChildrenProperty = DependencyProperty.Register("HasChildren", typeof(Boolean), typeof(TreeViewItem_CustomControl));
    }

    static DependencyProperty HasChildrenProperty;

    public Boolean HasChildren
    {
        get
        {
            return (Boolean)base.GetValue(HasChildrenProperty);
        }

        set
        {
            if (value)
            {
                if (this.Items != null)
                {
                    this.Items.Add(String.Empty); //Dummy item
                }
            }
            else
            {
                if (this.Items != null)
                {
                    this.Items.Clear();
                }
            }

            base.SetValue(HasChildrenProperty, value);
        }

    }
}

これはカスタム TreeViewItem のコードです。XAML で使用してみましょう。

<TreeView>
    <TreeViewItem Header="qwer">
        Regulat tree view item.
    </TreeViewItem>
    <CustomTree:TreeViewItem_CustomControl x:Name="xyz" Header="temp header" Height="50">
        <TreeViewItem>Custom tree view item, which will be removed.</TreeViewItem>
    </CustomTree:TreeViewItem_CustomControl>
</TreeView>

ご覧のとおり、最初のアイテムは通常のアイテムで、2 番目のアイテムはカスタム アイテムです。子供が1人いることに注意してください。次に、HasChildrenプロパティを ViewModel の Boolean オブジェクトにバインドするか、上記の XAML の背後にあるコードからHasChildren をFalseに設定してカスタム クラスをテストするだけです。

xyz.HasChildren = false;

要素に子が 1 つあるにもかかわらず、展開ボタンが表示されないため、カスタム クラスが機能します。

お役に立てば幸いですが、ご不明な点がございましたらお気軽にお問い合わせください。

ピーター。

于 2010-04-21T13:20:54.127 に答える