У меня есть ContextMenu на основе XAML, привязанное к строкам в сетке данных. Работает просто отлично - пока сетка не прокручена!
Это контекстное меню для одного из элементов управления в визуальном дереве или в строке DataGrid.
<data:DataGridTemplateColumn Header="Customer Details" Width="*">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid Background="Transparent"> <!-- allows click in entire cell -->
<controlsInputToolkit:ContextMenuService.ContextMenu>
<controlsInputToolkit:ContextMenu>
<controlsInputToolkit:MenuItem Header="{Binding CompletedOrderId,StringFormat='Create Reminder for order #\{0\}'}"
CommandParameter="{Binding}">
<controlsInputToolkit:MenuItem.Command>
<command:CreateReminderCommand/>
</controlsInputToolkit:MenuItem.Command>
<controlsInputToolkit:MenuItem.Icon>
<Viewbox>
<Image Width="19" Height="18" Source="../images/reminders.png" VerticalAlignment="Center"/>
</Viewbox>
</controlsInputToolkit:MenuItem.Icon>
</controlsInputToolkit:MenuItem>
<controlsInputToolkit:ContextMenu>
<controlsInputToolkit:ContextMenuService.ContextMenu>
......
ICommand
равно CreateReminderCommand
, а CommandParameter
привязано к элементу данных для самой строки.
Это прекрасно работает - я могу щелкнуть правой кнопкой мыши по строке, и она покажет мне правильный текст в пункте меню «Создать напоминание для заказа 12345».
Затем я прокручиваю сетку данных вниз по странице. Если я продолжу щелкать правой кнопкой мыши по пунктам, то вдруг увижу неправильный номер заказа для строки. Я думаю, что должно происходить так:
- DataGrid повторно использует экземпляры MenuItem, которые он ранее создал.
Как я могу принудительно обновить ContextMenu, когда оно отображается для элемента, который изменяется? В ContextMenu или ContextMenuService отсутствует метод обновления.