2011-09-26 35 views
6

tôi có mã như thế này:WPF ListBoxItem và ContextMenu

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Vertical" 
        ContextMenuService.ShowOnDisabled="True"> 
      <StackPanel.ContextMenu> 
       <ContextMenu> 
        <MenuItem Command="Delete" Click="DeleteEvent">  
        </MenuItem> 
       </ContextMenu> 
      </StackPanel.ContextMenu> 
       <TextBlock Text="{Binding EventName}"> 
      </TextBlock>   
     </StackPanel> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

Đáng tiếc là Nó không làm việc. Menu ngữ cảnh của tôi bị vô hiệu hóa (nó đang hiển thị nhưng tôi không thể nhấp vào nó vì nó bị tắt). Tôi đã đọc rằng vấn đề này có liên quan đến vấn đề lựa chọn nhưng tôi không tìm thấy bất kỳ giải pháp cho điều đó. Bạn có bất cứ ý tưởng?

+0

Tại sao bạn cố gắng đặt Sự kiện nhấp và Lệnh của MenuItem cùng một lúc? Ngoài ra bạn có muốn ContextMenu này được hiển thị cho mỗi mục hoặc cho danh sách không? Ở đây nó được thiết lập cho toàn bộ danh sách. – Ucodia

+0

Bạn có thể cụ thể hơn hoặc cho tôi biết thêm chi tiết về giải pháp của bạn không? – radzio

+0

@ Ucodia: tại sao cho toàn bộ danh sách? Có vẻ như nó được đặt bên trong ListBox.ItemTemplate? – sll

Trả lời

5

Thứ nhất, điều lạ lùng là bạn đang cố gắng đặt Command và sự kiện Click. Bạn nên đặt cái này hay cái kia. Có thể thực tế là hành động bị vô hiệu hóa là bởi vì bạn đang thiết lập một Lệnh với một giá trị của CanExecute = false;

Thay vì viết một DataTemplate, bạn có thể cố gắng để thiết lập các ItemContainerStyle cho ListBoxItem như thế này:

<ListBox> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="ContextMenu"> 
       <Setter.Value> 
        <ContextMenu> 
         <MenuItem Header="Delete" Click="DeleteEvent"/> 
        </ContextMenu> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="Content" Value="{Binding Path=EventName}"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

Ở đây tôi trực tiếp thiết lập các ContextMenu của instance ListBoxItem vì vậy nó sẽ hiển thị menu trên điều khiển bên phải .

+2

Thật không may tôi đã nhận lỗi này với giải pháp của bạn: {"Không thể truyền đối tượng kiểu 'System.Windows.Controls. MenuItem 'để gõ' System.Windows.Controls.Button '. "} – radzio

+0

Sau đó, có lẽ bạn nên chính xác hơn trong những gì bạn đang chính xác cố gắng để làm với danh sách này bởi vì điều này không nên ném loại ngoại lệ. – Ucodia

+0

Tôi đã thêm menu ngữ cảnh vào Tài nguyên và nó hoạt động: http://stackoverflow.com/questions/4752273/setting-event-handlers-inside-a-setter-value-structure – radzio

0

Bạn chỉ cần thay đổi lệnh để tiêu đề và xử lý DeleteEvent

<ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Vertical" 
         ContextMenuService.ShowOnDisabled="True"> 
       <StackPanel.ContextMenu> 
        <ContextMenu> 
         <MenuItem Header="Delete" Click="DeleteEvent">  
         </MenuItem> 
        </ContextMenu> 
       </StackPanel.ContextMenu> 
        <TextBlock Text="{Binding EventName}"> 
       </TextBlock>   
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
0

ListBox đã có một MenuContext. Bạn có thể thử nó

<ListBox x:Name="MyistBox">      
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBox Text="{Binding Name}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
     <ListBox.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Update"/> 
       <MenuItem Header="Delete"/> 
      </ContextMenu> 
     </ListBox.ContextMenu> 
    </ListBox> 
Các vấn đề liên quan