2012-04-12 6 views
9

Я пытаюсь получить контекстное меню в ListBox ItemTemplate, чтобы вызвать метод в родительской модели представления, передав элемент, на который был нажат в качестве параметра. У меня это работает для других кнопок в шаблоне элемента, но для контекстного меню он, кажется, терпит неудачу.Контекстные меню WPF в Caliburn Micro

У меня есть следующий код XAML (сокращенно для ясности):

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

У меня есть ощущение, что это связано с тем, что визуальное дерево отличается, поэтому Caliburn не в состоянии решить метод надежно. Я уверен, что это обычная проблема, и я пробовал несколько вещей, которые я нашел в Интернете, но ничего не работает.

Любые идеи?

ответ

20

Используя информацию, которую я нашел на Caliburn Micro site я изменил свой XAML, чтобы выглядеть следующим образом:

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

И мой взгляд модель:

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

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

Open успешно вызывается с соответствующими строками из список.

+0

Я попробую попробовать как можно скорее. – jonnii

+2

Интересно, почему это не произошло. Большое спасибо, спасибо. –