WPF TreeView DataBinding Hide/Show展開/崩壊アイコン
-
28-09-2019 - |
質問
説明のようにWPFロードオンデマンドツリービューを実装しました これ (非常に良い)記事。上記のソリューションでは、ダミー要素を使用して拡張を維持します +
アイコン /ツリービューアイテムの動作。ダミーアイテムは、ユーザーがエキスパンダーをクリックすると、実際のデータに置き換えられます。
プロパティを追加してモデルを改良したい public bool HasChildren { get { ... } }
私の支援に TreeNodeViewModel
.
質問:
このプロパティをバインドして、拡張アイコン(XAML)を非表示/表示するにはどうすればよいですか?適切なトリガー/セッターの組み合わせを見つけることができません。
(InotifyPropertyChangedが適切に実装されています。)
御時間ありがとうございます。
更新1:
自分の財産を使いたいです public bool HasChildren
代わりは ダミー要素を使用する。
アイテムが子供を持っているかどうかを判断することはやや費用がかかりますが、子供を連れて行くよりもはるかに安いです。
解決
ジュリアン、
これは本当に良い質問です。独自のツリービューアイテムを作成しようとしてみませんか? :)つまり、ゼロからではなく、既存の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);
}
}
}
これは、カスタムツリービューイテムのコードでした。 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人の子供がいることに注意してください。次に、バインドできます ハッシルドレン viewmodelのブールオブジェクトへのプロパティを使用するか、haschildrenをに設定してカスタムクラスをテストするだけです 偽 上記のXAMLの背後にあるコードから:
xyz.HasChildren = false;
これで、要素には1人の子供がいますが、展開ボタンは表示されませんので、カスタムクラスが機能することを意味します。
私はあなたを助けてくれることを願っていますが、質問があるかどうかを自由に聞いてください。
piotr。
他のヒント
Joshのコードをすばやく調べた後、このコンストラクターを見つけました。
protected TreeViewItemViewModel(TreeViewItemViewModel parent, bool lazyLoadChildren)
{
_parent = parent;
_children = new ObservableCollection<TreeViewItemViewModel>();
if (lazyLoadChildren)
_children.Add(DummyChild);
}
だから、あなたが合格した場合 false
のために lazyLoadChildren
継承ViewModelクラスのパラメーターは、DummyChildが追加されていないため、 +アイコンが表示されません。あなたのアイテムが子供を持っているかどうかを知っているように見えるので、あなたは lazyLoadChildren
財産。それとも私は何かが足りませんか?