2012-04-12 13 views
9

Tôi đang cố gắng lấy menu ngữ cảnh trong ListBox ItemTemplate để gọi phương thức trên mô hình chế độ xem gốc, chuyển mục được nhấp vào làm tham số. Tôi có điều này làm việc cho các nút khác trong mẫu mục, nhưng đối với menu ngữ cảnh có vẻ như không thành công.WPF Ngữ cảnh Thực đơn trong Caliburn Micro

Tôi có XAML sau (viết tắt cho rõ ràng):

<ListBox> 
    <ListBox.GroupStyle> 
     <GroupStyle> 
      ... 
     </GroupStyle> 
    </ListBox.GroupStyle> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ContextMenu> 
        <ContextMenu Name="cm"> 
         <MenuItem Header="Open" 
            cal:Message.Attach="Open($dataContext)"> 

         </MenuItem> 
       </Grid.ContextMenu> 

       <TextBlock VerticalAlignment="Center" > 
        .. text.. 
       </TextBlock> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Tôi có một cảm giác này đã làm với thực tế là cây thị giác là khác nhau, vì vậy Caliburn là không thể giải quyết phương pháp đáng tin cậy. Tôi chắc chắn đây là một vấn đề phổ biến, và tôi đã thử một vài trong số những thứ tôi đã tìm thấy trực tuyến, nhưng dường như không có gì hoạt động.

Bất kỳ ý tưởng nào ??

Trả lời

20

Sử dụng thông tin mà tôi tìm thấy trên Caliburn Micro site tôi sửa đổi XAML của bạn trông như thế này:

<Grid Background="White" HorizontalAlignment="Stretch" Height="200" Name="GridLayout">  
    <ListBox x:Name="ListBoxItems">    
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid Tag="{Binding DataContext, ElementName=GridLayout}"> 
        <Grid.ContextMenu> 
         <ContextMenu Name="cm" cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"> 
          <MenuItem Header="Open" 
           cal:Message.Attach="Open($dataContext)"> 
          </MenuItem> 
         </ContextMenu> 
        </Grid.ContextMenu> 

        <TextBlock VerticalAlignment="Center" > 
       .. text.. 
        </TextBlock> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

Và mô hình quan điểm của tôi:

public List<string> ListBoxItems { get; set; } 
    public ShellViewModel() 
    { 
     ListBoxItems = new List<string> {"One", "Two", "Three"};   
    } 

    public void Open(object source) 
    { 
     MessageBox.Show((string) source); 
    } 

mở được gọi là thành công với chuỗi thích hợp từ hộp danh sách.

+0

Tôi sẽ thử tính năng này. – jonnii

+2

Tôi tự hỏi tại sao điều này đã không được trang bị. Giúp tôi rất nhiều, cảm ơn bạn. –