4

ComboBox列の 1 つとしてを持つ WPF アプリケーション (Entity Framework を使用) に DataGrid があります。これComboBoxは、ドロップダウンに表示されている名前を含むテーブルへの結合参照を使用しているデータソースにバインドされています。この結合には ID フィールド (SalesActMgrID と呼ばれる) を使用しています。そのテーブルの特定の名前の List<> だけをドロップダウン リストに入力しています。

私の問題は、ドロップダウン リストから名前を選択すると、 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 テーブルで実際に更新されるため、元の名前を表示していたグリッドのすべての行で、新しい選択された名前に変更されます名前(これは私が望んでいるものではありません)。

4

1 に答える 1

0

OPがコメントに投稿した内容を要約します。編集ハンドラーで選択した項目にアクセスするには、次を使用します。

 (e.EditingElement as ComboBox).SelectionBoxItem
于 2014-02-14T11:41:46.610 に答える