XAML ContextMenu связывается с неправильной строкой в ​​DataGrid - PullRequest
1 голос
/ 06 мая 2010

У меня есть 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 отсутствует метод обновления.

1 Ответ

2 голосов
/ 13 мая 2010

Это оказалось ошибкой Silverlight, связанной с привязкой элемента.

http://blogs.msdn.com/delay/archive/2010/05/11/we-ve-secretly-changed-this-control-s-datacontext-let-s-see-if-it-notices-workaround-for-a-silverlight-data-binding-bug-affecting-various-scenarios-including-datagrid-contextmenu.aspx

Приведенное здесь решение устраняет проблему.

...