如何在(WPF)DataGridComboBoxColumn中展开ComboBox?

3

在我的C# WPF应用程序(.NET 4.0)中,我有一个DataGrid从代码动态填充,其中包括一个DataGridComboBoxColumn:

public static DataGridComboBoxColumn getCboCol(string colName, Binding textBinding)
{
    List<string> statusItemsList = new StatusList();

    DataGridComboBoxColumn cboColumn = new DataGridComboBoxColumn();
    cboColumn.Header = colName;
    cboColumn.SelectedItemBinding = textBinding;
    cboColumn.ItemsSource = statusItemsList;

    return cboColumn;
}

使用 BeginningEdit 事件执行不同的检查。

如果检查返回正常,我想直接展开组合框,否则编辑模式将被取消:

void dataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    ...
    if(notOK)
        e.Cancel;
    else {
        DataGridComboBoxColumn dgCboCol = (DataGridComboBoxColumn)e.Column;
        // expand dgCboCol
    }
    ...
}
问题:如何在程序中展开组合框?BeginningEdit事件是正确的位置吗? 答案:

void dataGrid_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
    if (e.EditingElement.GetType().Equals(typeof(ComboBox)))
    {
        ComboBox box = (ComboBox)e.EditingElement;
        box.IsDropDownOpen = true;
    }
}

1
你这样动态定义有特别的原因吗?为什么不在XAML中定义呢? - jamesSampica
2个回答

2

请看这个

尝试将网格的编辑模式设置为单击,然后使用CellClick事件获取comboBox并展开它。

dataGrid.BeginEdit(true); 
ComboBox comboBox = (ComboBox)dataGrid.EditingControl; 
comboBox.IsDropDownOpen = true;

1
在 DataGrid 上没有名为 EditingControl 的属性。 - Christian St.

1
DataGridBeginningEditEventArgs 中,你可以通过以下方式访问即将编辑的单元格生成的元素:
var contentComboBox = e.Column.GetCellContent(e.Row) as ComboBox;

然而,我不确定这样做是否能获得您需要的实际ComboBox。DataGrids可以为每个单元格生成两个不同的元素,具体取决于它们是否处于编辑模式(只读和可读写元素)。由于BeginningEdit发生在进入编辑模式之前,因此这将获取只读元素。
最好处理此事件的方法可能是PreparingCellForEdit,它将在实际调用数据项上的BeginEdit后触发(换句话说,如果未取消BeginningEdit)。在该事件中,您可以通过EditingElement属性直接访问元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接