DevExpress GridControl ComboBoxEdit列表项上下文菜单命令绑定

时间:2018-06-26 14:51:39

标签: binding contextmenu devexpress-wpf

我有一个使用CellTemplateSelector动态创建的DevExpress GridControl。 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 属性绑定到通过 RowData.Row 属性访问的DataGridRow属性,而<还可以通过 RowData.Row 属性访问strong> DeleteNameCommand 。

当用户单击ComboBoxEdit向下箭头时,将显示“名称”列表,而当用户右键单击列表名称时,将显示上下文菜单。由于PopupMenu / BarButtonItem不属于可视树,因此如何将BarButtonItem的 Command 属性绑定到在ComboBoxEdit中访问的RowData.Row属性? ...以及如何传递右键单击的ComboBoxEdit列表项的文本作为 CommandParameter 的值?

非常感谢任何指向正确方向的指针。

1 个答案:

答案 0 :(得分:1)

好的...经过数天的努力,DevExpress的优秀人才能够为我提供解决方案。我很抱歉没有想到(很糟糕)发布问题,所以我很快就得到了解决方案(昨天下午我问了他们),但是我认为将解决方案告知社区很有用。

可通过

访问ComboBoxEdit编辑器数据上下文。

(dxe:BaseEdit.OwnerEdit).DataContext

并访问关联的 RowData.Row 属性,该属性本身包含可用于的每一行的属性,可通过

访问

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

因此,可以将PopupMenu / BarButtonItem Command 绑定到DataGridRow类中包含的DeleteNameCommand,该类本身可以通过RowData.Row通过指定以下内容进行访问:

命令=“ {绑定路径=(dxe:BaseEdit.OwnerEdit).DataContext.RowData.Row.DeleteNameCommand,RelativeSource = {RelativeSource Self}}”

...,通过以下声明,可以右键单击ComboBoxEdit列表项的文本作为CommandParameter的值:

CommandParameter =“ {Binding}”

...很高兴:-)