2009-06-20 26 views
7

Tôi có một điều khiển người dùng với một ListView chứa các mục đơn giản từ ObservableCollection. Tôi muốn ContextMenu của ListView đó chứa các mục tùy thuộc vào những gì được chọn trong ListView. Nếu không có mục nào được chọn, một số MenuItem sẽ không hiển thị.Bind ContextMenu's MenuTính năng hiển thị danh sách để chọn ListView

Trình chuyển đổi của tôi thậm chí không được gọi khi tôi mở ContextMenu. Ràng buộc có vẻ sai, tôi thấy điều này trong cửa sổ đầu ra:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=listView'. BindingExpression:Path=SelectedItem; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'Visibility' (type 'Visibility')

Tôi không hiểu điều gì sai và không thể tìm ra bằng cách tìm kiếm trên web.

Dưới đây là một số mã đơn giản:

<UserControl x:Class="MyApp.DatabaseControl" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:l="clr-namespace:MyApp" 
Height="Auto" 
Width="Auto"> 

<UserControl.Resources> 
    <l:ValueToVisibilityConverter x:Key="valueToVisibility" /> 
</UserControl.Resources> 

<Grid> 
    <ListView x:Name="listView" ItemsSource="{Binding Persons}"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Width="140" Header="First Name" DisplayMemberBinding="{Binding FirstName}"/> 
       <GridViewColumn Width="140" Header="Last Name" DisplayMemberBinding="{Binding LastName}" /> 
      </GridView> 
     </ListView.View> 

     <ListView.ContextMenu> 
      <ContextMenu> 
       <MenuItem 
        Header="Open" 
        Visibility="{Binding SelectedItem, ElementName=listView, Converter={StaticResource valueToVisibility}}"/> 
       <Separator/> 
       <MenuItem Header="Add..."/> 
       <MenuItem Header="Remove"/> 
      </ContextMenu> 
     </ListView.ContextMenu> 
    </ListView> 
</Grid> 

Cảm ơn rất nhiều!

Trả lời

7

Vấn đề là ContextMenu không có trong cùng một cây trực quan như ListBox, do đó các ràng buộc không tìm thấy số ListBox. Nếu bạn ràng buộc chống lại PlacementTarget, điều đó sẽ thực hiện thủ thuật:

<MenuItem Header="Open" 
    Visibility="{Binding RelativeSource={RelativeSource FindAncestor, 
     AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem, 
     Converter={StaticResource valueToVisibility}}" /> 
+0

Cảm ơn, điều này đã làm được điều đó !! – fury

+0

Nếu điều này trả lời câu hỏi của bạn, bạn nên đánh dấu câu hỏi là Được chấp nhận để câu hỏi đó không còn hiển thị dưới dạng câu hỏi chưa được trả lời. – Andy

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