WPF MVVM: 如何创建并显示上下文菜单?

3

我正在使用MVVM来开发我的WPF应用程序,现在我想在用户右键单击某个内容时显示生成的上下文菜单。
将右键单击路由到某个操作很容易,但是如何显示由ViewModel生成的上下文菜单呢?

由于在MVVM中没有直接访问视图,所以我甚至不知道从哪里开始显示上下文菜单。

3个回答

3
如果你想在一个显示销售数据的DataGrid上展示一个ContextMenu,你可以这样做:
            <y:DataGrid.ContextMenu>
            <ContextMenu>
                <MenuItem Name="cmNewSales" Foreground="Black" Command={Binding Path=MyCommand}/>


            </ContextMenu>
        </y:DataGrid.ContextMenu>

其中MyCommand是ViewModel公开的Command属性,或在ViewModel中创建一个命令ObservableCollection,将其公开并绑定到ContextMenu的ItemSource属性。

希望这可以帮助您。


在我的情况下,我希望将ContextMenu附加到ListView中GridView的标题项上 - 有任何想法在这种情况下应该把ContextMenu放在哪里(我不希望ContextMenu出现在ListView的每个地方,只想要它出现在标题上)? - Sam
嗨,Sam,我刚刚回答了一个新的“答案”,这样代码就可以正确格式化。请看下面。 - jameschinnock
我认为这是更好的答案,因为它将菜单的显示责任移至视图,同时保持菜单项逻辑的执行在VM中。这也意味着菜单项可以重新排列、删除、修改等等,而不需要涉及VM,因为所有演示都在XAML中。 - nrjohnstone

3

抱歉回复晚了,我必须进行一些实验才能让它正常工作。请试用以下代码。我只是设置了自己的垃圾数据源,以便显示某种数据。它仅在我右键单击第一列标题时显示,而不是其他任何地方...这应该是你想要的,对吧?让我知道你的进展如何...如果有任何问题,我会继续思考。

   <Grid>
    <ListView Margin="8,8,33,12"  ItemsSource="{Binding Source={StaticResource Stuff}, Path=MyCollection}">
        <ListView.View>
        <GridView>
                <GridViewColumn Width="100" DisplayMemberBinding="{Binding}">
                    <GridViewColumnHeader>ProductName
                        <GridViewColumnHeader.ContextMenu>
                            <ContextMenu Name="MyMenu">
                                <MenuItem Header="Sort by..."/>
                                <MenuItem Header="Follow link..."/>
                            </ContextMenu>
                        </GridViewColumnHeader.ContextMenu>
                    </GridViewColumnHeader>
                </GridViewColumn>
                <GridViewColumn Width="100" Header="Product Name" DisplayMemberBinding="{Binding Path=Length}"/>
        </GridView>
        </ListView.View>
    </ListView>
</Grid>

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接