2012-10-12 49 views
4

我有一個WPF應用程序(與實體框架)中有一個ComboBox作爲其中一列的DataGrid。這個ComboBox被綁定到一個數據源,該數據源正在使用對包含正在下拉菜單中顯示的名稱的表的連接引用。它爲此連接使用一個ID字段(稱爲SalesActMgrID)。我正在填充下拉列表,其中只有來自該表的特定名稱的列表<>。WPF DataGrid組合框提交前檢索值

我的問題是,當從下拉列表中選擇一個名稱時,它將更改該連接表中的名稱,而不是將SalesActMgrID更改爲所選名稱。

我已經想出了一種方法來更新我的數據源中的ID,但我還沒有想出一種方法來找出在下拉列表中選擇了什麼名稱,以便我可以獲得該名稱的正確ID。

   <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表中更新,因此在顯示原始名稱的網格中的每一行都會更改到新的選定名稱(這不是我想要的)。

+0

果然,過去幾天我一直在尋找這個問題的答案。在我發佈之後,下一次我繼續搜索時,我終於找到了答案:(e.EditingElement as ComboBox).SelectionBoxItem – user1741541

回答

0

我只會總結一下OP在評論中發表的內容。要訪問編輯處理程序中的選定項目,請使用:

(e.EditingElement as ComboBox).SelectionBoxItem