WPF: Как получить значение элемента ListView, на котором я назвал контекстное меню?

У меня есть listview в стиле gridview с двумя столбцами. Интересно, как получить первое значение столбца элемента, на котором я назвал контекстное меню (CM имеет только одну кнопку, где я хочу обрабатывать значение)?

Вот XAML:

<listview.resources>
 <contextmenu x:key="ContextMenu">
 <menuitem header="Run test with parameters" x:name="runTestWithParams" click="runTestWithParams_Click">
 </menuitem></contextmenu>
 </listview.resources>
 <listview.itemcontainerstyle>
 
 </listview.itemcontainerstyle>

И вот контекстный манипулятор кнопки:

private void runTestWithParams_Click(object sender, RoutedEventArgs e)
 {
 string valueOfFirstColumn = // something like ItemThatWasClicked["ID"].ToString(); 
 }

Если у вас есть идеи, пожалуйста, помогите мне.

РЕШЕНИЕ НАЙДЕНО

Необходимо было создать обработчик события RightMouseUp и получить значение, которое мне нужно от его отправителя, поскольку Context_Menu_button_Click отправитель не содержит информации об элементе, на который он был нажат, но содержит информацию о ContextMenu. Итак... Я обработал это так:

Обработчик:

private void HandleMouseRightButtonUp(object sender, MouseButtonEventArgs e)
 {
 ListViewItem selected = sender as ListViewItem;
 String valueINeed = (selected.Content as TestIdentification).Id;
 }

XAML:

Спасибо за все!

2 ответа

Ваша проблема является общей... ContextMenu не является частью основного визуального дерева, в котором находятся остальные элементы управления, и по умолчанию у него нет правильного DataContext. Тем не менее, вы будете рады узнать, что это довольно просто исправить. Обычно я использую свойство Tag для передачи DataContext в ContextMenu:

<listview.resources>
 <contextmenu x:key="ContextMenu" datacontext="{Binding PlacementTarget.Tag, 
 RelativeSource={RelativeSource Self}}">
 <menuitem header="Run test with parameters" x:name="runTestWithParams" click="runTestWithParams_Click">
 </menuitem></contextmenu>
</listview.resources>
<listview.itemtemplate>
 <datatemplate datatype="{x:Type YourNamespace:YourDataType}">
 <grid tag="{Binding DataContext, RelativeSource={RelativeSource Self}}" contextmenu="{StaticResource ContextMenu}">
 <!--Define what your data objects look like here or just use this-->
 <textblock text="{Binding}">
 </textblock></grid>
 </datatemplate>
</listview.itemtemplate>

Теперь я раньше этого не делал, поэтому у нас могут возникнуть проблемы, но мы все равно пойдем. Когда пользователь нажимает на MenuItem, теперь у вас должен быть доступ к объекту данных с использованием свойства sender.DataContext. Дайте мне знать, как это происходит.


Другое решение - обработать событие ContextMenuOpening в ListView. Оттуда вы можете получить доступ к свойству ContextMenuEventArgs.OriginalSource, чтобы получить элемент, из которого происходит событие.

licensed under cc by-sa 3.0 with attribution.