DevExpress GridControl ComboBoxEdit привязка команды контекстного меню элемента списка - PullRequest
0 голосов
/ 26 июня 2018

У меня есть этот DevExpress GridControl, который динамически создается с помощью CellTemplateSelector. Один из столбцов GridControl определяется шаблоном DataTemplate, который выглядит следующим образом:

        <DataTemplate x:Key="NameComboColumnTemplate">
        <ContentControl>
            <dxg:GridColumn
                x:Name="GridColumnName"
                FieldName="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).FieldName, RelativeSource={RelativeSource Self}}"
                Header="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).Header, RelativeSource={RelativeSource Self}}" 
                Width="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).Width, RelativeSource={RelativeSource Self}}">
                <dxg:GridColumn.CellTemplate>
                    <DataTemplate>
                        <dxe:ComboBoxEdit
                            IsTextEditable="False"
                            SelectedItem="{Binding RowData.Row.SelectedCylinderName, Mode=TwoWay}"
                            ItemsSource="{Binding RowData.Row.NameList, Mode=TwoWay}">
                            <dxe:ComboBoxEdit.ItemContainerStyle>
                                <Style TargetType="dxe:ComboBoxEditItem">
                                    <Setter Property="dxb:BarManager.DXContextMenu">
                                        <Setter.Value>
                                            <dxb:PopupMenu>
                                                <dxb:BarButtonItem 
                                                    x:Name="BarButtonItemName"
                                                    Content="Delete"
                                                    Command="{Binding DeleteNameCommand}"
                                                    CommandParameter="{Binding}"/>
                                            </dxb:PopupMenu>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </dxe:ComboBoxEdit.ItemContainerStyle>
                        </dxe:ComboBoxEdit>
                    </DataTemplate>
                </dxg:GridColumn.CellTemplate>
            </dxg:GridColumn>
        </ContentControl>
    </DataTemplate>

Существует класс DataGridRow, который содержит свойства для ОДНОЙ строки данных GridControl. Этот класс также содержит команду, определенную как

    public ICommand DeleteNameCommand => new DelegateCommand<object>(obj => DeleteName(obj));

    private void DeleteName(object obj)
    {
        // the obj parametercontains the text present on the ComboBoxEdit list item that was
        //  right-clicked to display the context menu.

        // Delete the name from the list here
    }

Как показано выше, свойства ComboBoxEdit SelectedItem и ItemsSource связаны со свойствами DataGridRow, доступ к которым осуществляется через свойство RowData.Row , а также с помощью DeleteNameCommand также доступен через свойство RowData.Row .

Когда пользователь щелкает стрелку вниз ComboBoxEdit, отображается список имен, а когда пользователь щелкает правой кнопкой мыши имя списка, отображается контекстное меню. Так как PopupMenu / BarButtonItem не является частью дерева визуалов, как бы я связал свойство BarButtonItem Command со свойством RowData.Row, доступным в ComboBoxEdit? ... и как я могу передать текст элемента списка ComboBoxEdit, по которому щелкнули правой кнопкой мыши, как значение CommandParameter ?

Любые указатели в правильном направлении очень ценятся.

1 Ответ

0 голосов
/ 26 июня 2018

ОК ... после нескольких дней попыток выяснить это, великие люди в DevExpress смогли предоставить мне решение. Приношу свои извинения за публикацию вопроса, так как я не ожидал (что плохо), что смогу найти решение так быстро (я задал их вчера днем), но я счел полезным сообщить сообществу решение.

Контекст данных редактора ComboBoxEdit доступен через

(DXE: BaseEdit.OwnerEdit) .DataContext

и для доступа к связанному свойству RowData.Row , которое само содержит свойства, используемые для каждой строки столбец , доступно через

(DXE: BaseEdit.OwnerEdit) .DataContext.RowData.Row

Итак, из этого следует, что PopupMenu / BarButtonItem Command может быть привязан к DeleteNameCommand, содержащемуся в классе DataGridRow, который сам по себе доступен через RowData.Row, указав следующее:

Command = "{Binding Path = (dxe: BaseEdit.OwnerEdit) .DataContext.RowData.Row.DeleteNameCommand, RelativeSource = {RelativeSource Self}}}"

... и текст элемента списка ComboBoxEdit, по которому щелкнули правой кнопкой мыши, доступен для передачи в качестве значения для CommandParameter через следующее объявление:

CommandParameter = "{Binding}"

... и было много радости: -)

...