我有一个使用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 的值?
非常感谢任何指向正确方向的指针。
答案 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}”
...很高兴:-)