-->

WPF上下文菜单中微卡利(WPF Context Menus in Caliburn Micro)

2019-06-23 13:44发布

我试图让一个列表框的ItemTemplate内的上下文菜单中调用父视图模型的方法,传递被点击作为参数的项目。 我有这个工作在项目模板其他按钮,但对于上下文菜单这似乎是失败的。

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

我有一种感觉这是与事实,视觉树是不同的,所以卡利无法可靠地解决方法来做。 我敢肯定,这是一个常见的问题,我已经尝试了几个,我在网上找到的东西,但似乎没有奏效。

有任何想法吗??

Answer 1:

使用我所找到的信息卡利微型网站我修改你的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);
    }

打开成功调用从列表框中选择相应的字符串。



文章来源: WPF Context Menus in Caliburn Micro