WPF DataGrid ComboBox在提交之前检索值

时间:2012-10-12 16:18:32

标签: c# wpf datagrid combobox commit

我在WPF应用程序(带有实体框架)中有一个DataGrid,其中ComboBox作为其中一列。此ComboBox绑定到数据源,该数据源使用对包含下拉列表中显示的名称的表的连接引用。它正在为此连接使用ID字段(称为SalesActMgrID)。我只用List<>填充下拉列表该表中的具体名称。

我的问题是,当从下拉列表中选择名称时,它会更改该联接表中的名称,而不是将 SalesActMgrID 更改为所选名称。

我已经想出了一种更新数据源ID的方法,但是我还没有找到一种方法来找出在下拉列表中选择的名称,以便我可以获得该名称的正确ID。 / p>

组合列定义为:

               <DataGridComboBoxColumn 
                    SelectedItemBinding="{Binding Path=ClientContract.StaffRole_SalesActMgr.StaffName}" 
                    Header="Sales Act Mgr" 
                    x:Name="salesActMgrColumn" Width="Auto" >
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" 
                                Value="{Binding staffNamesListSAM}" />
                        <Setter Property="IsReadOnly"
                                Value="True" />
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
            </DataGridComboBoxColumn>

DataGrid绑定到EmployeeTime的数据源。 表的完整连接是:

EmployeeTime.ClientContractID is joined to ClientContract.ClientContractID {M-1}
StaffRoles.StaffRoleID is joined to ClientContract.SalesActMgrID {1-M}

我正在使用以下代码通过单元格编辑对单元格执行提交。

    private bool isManualEditCommit;

    private void consultantsDataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {
        if (!isManualEditCommit)
        {
            isManualEditCommit = true;
            string head = e.Column.Header.ToString();
            bool doCommit = true;

            switch (head)
            {
                case "Sales Act Mgr":
                    {
                        e.Cancel = true;
                        //This is where I have been able to 'hard code' in a different
                        //ID value into the SalesActMgrID field which then correctly
                        //updates the value, but I need to know what name was selected
                        //here so I can get the correct ID for that name and set it below.
                        ((EmployeeTime)e.EditingElement.DataContext).ClientContract.SalesActMgrID = 11;
                        doCommit = false;
                    }
                    break;
            }
            DataGrid grid = (DataGrid)sender;
            if (doCommit)
            {
                grid.CommitEdit(DataGridEditingUnit.Row, doCommit);
                EmployeeTime et = e.Row.Item as EmployeeTime;
                CreateBurdenValue(et);
            }
            else
            {
                grid.CancelEdit(DataGridEditingUnit.Row);
            }
            isManualEditCommit = false;
        }
    }
}

可能还有其他“更好”的方式来做这件事,我很想知道。至少,如果有人可以指出我可以在任何提交操作完成之前获得刚刚选择的所选名称的方向,我将不胜感激。

仅供参考,如果我让它通过并在单元格上执行正常的CommitEdit,则所选名称实际上会在StaffRole表中更新,因此在网格中显示原始名称的每一行上,它们都会更改为新选择的名称(这不是我想要的)。

1 个答案:

答案 0 :(得分:0)

我将简要总结评论中发布的OP。要访问编辑处理程序中的选定项目,请使用:

 (e.EditingElement as ComboBox).SelectionBoxItem