2011-01-19 36 views
6

Số lần xem trang WPF phản hồi các phím số +- để mở rộng và thu gọn các nút trên cây. Tuyệt quá!Có phải Treeview sử dụng các ràng buộc lệnh để mở rộng/thu gọn không?

Có một lệnh hiện tại mà tôi có thể ràng buộc các nút trên thanh công cụ hoặc các mục menu để thực hiện các tác vụ tương tự trong treeview không? Tôi không thấy bất cứ điều gì liên quan đến mở rộng/sụp đổ trong các hằng số lệnh chứng khoán.

Trả lời

5

Các TreeView xử lý việc mở rộng một TreeViewItem với chuột bằng cách gắn ToggleButton.IsChecked-TreeViewItem.IsExpanded trong ControlTemplate và xử lý mở rộng với bàn phím trong một ghi đè TreeViewItem.OnKeyDown. Vì vậy, không, nó không sử dụng lệnh trong việc thực hiện nó.

Nhưng bạn có thể thêm các lệnh của riêng mình mà không cần nỗ lực nhiều. Trong ví dụ này, tôi đã thêm một hành vi để một TreeView để nó đáp ứng các tiêu chuẩn OpenClose ứng dụng lệnh:

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

và đây là hành vi mà làm cho rằng công việc:

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; 
    } 
} 

Nếu bạn không quen với hành vi, trước tiên hãy thêm không gian tên này:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

và thêm tham chiếu tương ứng vào thư mục của bạn ct.

+2

Lưu ý rằng lắp ráp System.Windows.Interactivity không phải là một phần của bản phân phối thời gian chạy .NET 4.0; nó có sẵn trong phân phối lại của Microsoft Expression Blend SDK. – dthorpe

+0

Bằng cách nào đó, thực tế đó đã lảng tránh tôi, có lẽ vì tên của hội đồng. Mặc dù nó tạo ra một sự phụ thuộc vào một assembly bên ngoài, việc sử dụng các hành vi là một chiến thắng lớn bởi vì nó làm cho tính năng có thể tái sử dụng mà không cần liên quan đến bất kỳ code-behind nào. Cảm ơn bạn đã chỉ ra điều đó. –

Các vấn đề liên quan