2012-04-12 124 views
9

我想在ListBox的ItemTemplate中获取一个上下文菜单,以调用父视图模型上的一个方法,将作为参数点击的项传入。我有这项工作的项目模板中的其他按钮,但对于上下文菜单,它似乎失败。Caliburn Micro中的WPF上下文菜单

我有以下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> 

我有一种感觉,这需要做的事实,视觉树是不同的,所以卡利无法可靠地解决方法。我确信这是一个常见问题,我尝试了一些我在网上找到的东西,但似乎没有任何工作。

任何想法??

回答

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); 
    } 

公开赛成功调用从相应的琴弦列表框。

+0

我会给这个尝试尽快。 – jonnii 2012-04-24 12:11:53

+2

我想知道为什么这不是accacent。帮了我很多,谢谢。 – 2015-05-08 06:58:49