2012-04-12 95 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