【发布时间】:2010-05-05 21:19:59
【问题描述】:
我有一个基于 XAML 的 ContextMenu 绑定到数据网格中的行。它工作得很好 - 直到网格滚动!
这是可视树或 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 上没有“更新方法”。
【问题讨论】:
-
你能描述一下你是如何设法让这个菜单“绑定到数据网格行”的吗?
-
它实际上并没有绑定到行本身。它绑定到 DataGrid 中的一个单元格。我添加了一些 XAML 来显示 DataGrid 中的模板列。我找不到将其绑定到行的方法。几乎做到了,但是 ContextMenuService 中发生了太多的魔法让我无法做到
-
微软向我发送了解决方法.. 关于主题的博客条目待定...
标签: silverlight xaml silverlight-4.0 contextmenu