Контекстное меню Silverlight: как определить, какое меню было нажато? - PullRequest
0 голосов
/ 20 декабря 2010

У меня есть следующее контекстное меню:

                <ListBox x:Name="sectionList" Margin="56,8,15,0" FontSize="64" SelectionChanged="SectionList_SelectionChanged">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <toolkit:ContextMenuService.ContextMenu>
                                    <toolkit:ContextMenu>
                                        <toolkit:MenuItem Header="Hide this section from this list" Click="ContextMenuItem_Click" />
                                    </toolkit:ContextMenu>
                                </toolkit:ContextMenuService.ContextMenu>
                                <TextBlock Text="{Binding DisplayName}" />
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

Как видите, у каждого отображаемого элемента есть свое контекстное меню. Каждое контекстное меню подключено к одному и тому же обработчику событий:

    private void ContextMenuItem_Click(object sender, RoutedEventArgs e)
    {

    }

От этого метода, как я могу узнать, какое контекстное меню было нажато? Я хочу знать, что такое DataContext для соответствующего DataTemplate.

Ответы [ 3 ]

4 голосов
/ 21 декабря 2010

Вы можете получить элемент, с которым связан ListBoxItem, приведя отправителя к типу FrameworkElement, чтобы получить доступ к DataContext:

(sender as FrameworkElement).DataContext

Затем вы можете привести его к соответствующему классу модели.и получить доступ к деталям, которые вам нужны.например:

((sender as FrameworkElement).DataContext as ItemViewModel).DisplayName
1 голос
/ 20 декабря 2010

Если вы используете <StackPanel Tag="{Binding}">, то ((FrameworkElement)sender).Tag вернет объект DataContext (разумеется, вам придется привести его перед использованием).

1 голос
/ 20 декабря 2010

Если вы поместите точку останова в обработчик событий ContextMenuItem_Click,, вы сможете проверить свойства sender и e. Вы, вероятно, найдете свой ответ там.

Один из способов сделать это - навести курсор на эти слова. Еще бы использовать Непосредственное Окно. Введите sender и точку, чтобы получить intellisense.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...