2011-01-19 7 views
6

WPFツリービューは、ツリー内のノードを展開および折りたたむために、+および-キーストロークに応答します。すばらしいです!Treeviewはexpand/collapseコマンドバインディングを使用していますか?

既存のコマンドがありますか?ツールバーのボタンやメニュー項目をバインドして、ツリービューで同じ操作を実行できますか?株価指数定数の拡大/縮小に関しては何も表示されません。 TreeView

答えて

5

ControlTemplateTreeViewItem.IsExpandedToggleButton.IsCheckedを結合することによってマウスでTreeViewItemの膨張を処理し、オーバーライドTreeViewItem.OnKeyDownにキーボードと拡張を扱います。したがって、いいえ、その実装ではコマンドを使用しません。

しかし、あまり手間をかけずに独自のコマンドを追加できます。それは、標準OpenCloseアプリケーションコマンドに応答するように、この例では、私はTreeViewに行動を追加しました:

<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" 

そして、あなたのプロジェct。

+2

System.Windows.Interactivityアセンブリは、.NET 4.0ランタイム配布の一部ではありません。 Microsoft Expression Blend SDKの再配布可能ファイルで利用できます。 – dthorpe

+0

どういうわけか、その事実は、おそらくアセンブリの名前のため、私を逃していた。外部アセンブリに依存関係を作成しますが、ビヘイビアを使用することは、コードビハインドを伴わずにこの機能を再利用できるようにするため、大きな利点です。それを指摘してくれてありがとう。 –

関連する問題