WPF Treeview はキーストロークに応答して+、-ツリー内のノードを展開したり折りたたんだりします。すごい!
ツリービューで同じアクションを実行するためにツールバー ボタンまたはメニュー項目をバインドできる既存のコマンドはありますか? ストックコマンドの定数には、展開/折りたたみに関連するものは何もありません。
WPF Treeview はキーストロークに応答して+、-ツリー内のノードを展開したり折りたたんだりします。すごい!
ツリービューで同じアクションを実行するためにツールバー ボタンまたはメニュー項目をバインドできる既存のコマンドはありますか? ストックコマンドの定数には、展開/折りたたみに関連するものは何もありません。
は、 にバインドすることでマウスによるTreeView
の展開を処理し、オーバーライドでキーボードによる展開を処理します。いいえ、その実装ではコマンドを使用しません。TreeViewItem
ToggleButton.IsChecked
TreeViewItem.IsExpanded
ControlTemplate
TreeViewItem.OnKeyDown
しかし、それほど苦労せずに独自のコマンドを追加できます。この例では、標準コマンドとアプリケーション コマンドTreeView
に応答するように動作を に追加しました。Open
Close
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="Open" CommandTarget="{Binding ElementName=treeView1}" Command="Open"/>
<MenuItem Header="Close" CommandTarget="{Binding ElementName=treeView1}" Command="Close"/>
</Menu>
<TreeView>
<i:Interaction.Behaviors>
<local:TreeViewCommandsBehavior/>
</i:Interaction.Behaviors>
<TreeViewItem Header="Root">
<TreeViewItem Header="Item1">
<TreeViewItem Header="Subitem1"/>
<TreeViewItem Header="Subitem2"/>
</TreeViewItem>
<TreeViewItem Header="Item2">
<TreeViewItem Header="Subitem3"/>
<TreeViewItem Header="Subitem4"/>
</TreeViewItem>
</TreeViewItem>
</TreeView>
</DockPanel>
そして、これを機能させる動作は次のとおりです。
public class TreeViewCommandsBehavior : Behavior<TreeView>
{
private TreeViewItem selectedTreeViewItem;
protected override void OnAttached()
{
AssociatedObject.AddHandler(TreeViewItem.SelectedEvent, new RoutedEventHandler(TreeViewItem_Selected));
AssociatedObject.CommandBindings.Add(new CommandBinding(ApplicationCommands.Open, CommandExecuted));
AssociatedObject.CommandBindings.Add(new CommandBinding(ApplicationCommands.Close, CommandExecuted));
}
private void TreeViewItem_Selected(object sender, RoutedEventArgs e)
{
selectedTreeViewItem = e.OriginalSource as TreeViewItem;
}
private void CommandExecuted(object sender, ExecutedRoutedEventArgs e)
{
bool expand = e.Command == ApplicationCommands.Open;
if (selectedTreeViewItem != null)
selectedTreeViewItem.IsExpanded = expand;
}
}
動作に慣れていない場合は、最初に次の名前空間を追加してください。
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
対応する参照をプロジェクトに追加します。