2009-02-02 30 views
11

Tôi có một kịch bản mà tôi có một điều khiển WPF TreeView có một HierarchicalDataTemplate cho các mục của nó. Bây giờ bên trong số HierarchicalDataTemplate, tôi có một số LabelLabel có một số ContextMenu với menuitem cho Delete. Các menuitem xóa được ràng buộc với một lệnh gọi là DeleteCommand là một phần của lớp đã được thiết lập như là DataType của HierarchicalDataTemplate.CommandParameters trong ContextMenu trong WPF

Bây giờ, tôi muốn vượt qua TreeView kiểm soát trong CommandParameters của của ContextMenu Delete menuitem của DeleteCommand vì vậy mà tôi có thể xử lý việc lựa chọn các TreeViewItems về việc xóa các mục đang được chọn.

Nhưng nếu tôi ràng buộc CommandParameters làm {Binding ElementName=TreeViewName} hoặc bất kỳ điều gì cho vấn đề đó, nó luôn luôn là không trừ khi phần tử được liên kết là thuộc tính trong DataContext.

Bất cứ ai có thể giúp tôi giải pháp bởi vì tôi nghĩ rằng, tôi đã thử tất cả những điều có thể như RelativeSource và AncestorType vv nhưng nó luôn luôn rỗng. Đối với tôi, nó trông giống như một giới hạn hoặc một lỗi trong khung công tác.

Trả lời

17

Vấn đề là ContextMenu nằm ở gốc cây trực quan của chính nó, vì vậy mọi liên kết RelativeSource.FindAncestor sẽ không đi qua ContextMenu.

Một giải pháp là sử dụng PlacementTarget tài sản để thành lập một hai giai đoạn ràng buộc từ Label của bạn:

<Label Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={ 
    x:Type TreeView}}}"> 
    <Label.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Delete" Command="{x:Static local:Commands.DeleteCommand}" 
       CommandParameter="{Binding PlacementTarget.Tag, RelativeSource={ 
       RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"/> 
     </ContextMenu> 
    </Label.ContextMenu> 
</Label> 

này khá hacky, tuy nhiên. Bạn nên thiết lập thuộc tính CommandTarget của MenuItem của bạn thành PlacementTarget của ContextMenu và có trình xử lý lệnh trên TreeView của bạn. Điều này có nghĩa là bạn sẽ không phải vượt qua TreeView xung quanh.

+3

Way dễ dàng: JoanComasFdz

+1

@JoanComas: sau khi thử tất cả những người khác nhưng không thành công (và cũng không hiểu những gì nó có nghĩa là tất cả với FindAncestors, vv), cách dễ dàng của bạn hoạt động hoàn hảo! Cảm ơn. – joedotnot

+2

Nhận xét của @JoanComasFdz thực sự hữu ích. Tôi có thể áp dụng 'CommandParameter =" {Binding} "' một cách đơn giản. – Youngjae

0
<MenuItem Header="..." 
      Command="{Binding Path=...}" 
      CommandParameter="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1, AncestorType={x:Type ContextMenu}}}"> 
</MenuItem> 

Ngữ cảnhMenu.PlacementTarget, là Nhãn, nơi lưu trữ menuitem. Từ Lavel, có thể truy cập vào Treeview của cha mẹ.

1
<ContextMenu> 
    <MenuItem Header="Edit Item" 
        Command="{Binding EditItemCommand, Mode=OneWay}" 
        CommandParameter="{Binding Path=UIElement.(views:DataGridView.SelectedItems), RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" /> 
<ContextMenu> 
Các vấn đề liên quan