WPF MVVM: как создать и показать контекстное меню?

Для своего приложения WPF я использую MVVM, и теперь я хочу отображать сгенерированное контекстное меню, когда пользователь щелкает что-то правой кнопкой мыши.
Направление щелчка правой кнопкой мыши на какое-либо действие было легко, но как показать контекстное меню какие элементы создаются ViewModel?

Я даже понятия не имею, с чего начать отображение контекстного меню, так как у меня нет прямого доступа к представлению в MVVM.


person Sam    schedule 20.07.2010    source источник


Ответы (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>
person jameschinnock    schedule 20.07.2010

Если, например, вы хотите показать ContextMenu поверх DataGrid, который может показывать продажи, вы можете сделать это:

            <y:DataGrid.ContextMenu>
            <ContextMenu>
                <MenuItem Name="cmNewSales" Foreground="Black" Command={Binding Path=MyCommand}/>


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

где MyCommand - это свойство Command, предоставляемое ViewModel, или создать ObservableCollection команд в ViewModel, которые отображаются и привязаны к свойству ItemSource ContextMenu.

надеюсь, это поможет

person jameschinnock    schedule 20.07.2010
comment
В моем случае я хочу, чтобы ContextMenu было прикреплено к элементам заголовка GridView в ListView - любые идеи, где разместить ContextMenu в этом случае (я не хочу, чтобы ContextMenu было везде в ListView, только заголовок) ? - person Sam; 20.07.2010
comment
Привет, Сэм, просто ответил как новый «ответ», чтобы код отформатировал нормально. Увидеть ниже. - person jameschinnock; 20.07.2010
comment
Я думаю, что это лучший ответ, поскольку это переносит ответственность за отображение меню в представление, сохраняя выполнение логики для пунктов меню в виртуальной машине. Это также означает, что элементы меню можно переставлять, удалять, изменять и т. Д. Без участия виртуальной машины, поскольку вся презентация находится в XAML. - person nrjohnstone; 19.02.2014

Самым неожиданным ответом было бы наличие списка команд (соответствующих элементам в вашем контекстном меню) в виртуальной машине. Привяжите ItemSource ContextMenu к VM.ListOfCommands. Используйте стили по вкусу.

Вот пример из тех же строк ... http://www.julmar.com/blog/mark/2009/04/21/UsingMVVMWithMenusInWPF.aspx

person Gishu    schedule 20.07.2010