WPF DataGrid组合框通过单独的ItemsSource绑定到加载的数据

时间:2019-01-09 20:17:58

标签: c# wpf xaml combobox datagrid

我有一个无法解决的难题,至少从以MVVM的角度来看这是没有道理的。

我有一个数据网格,其中包含客户-员工数据以及每个客户/员工关系的开始日期和结束日期。

DataGrid的所有ItemsSource是绑定到ClientToEmpObservableCollection的ClientToEmp CollectionViewSource。但是,在允许他们更改/更新当前雇员的组合框列中,ItemsSource是绑定到User ObservableCollection的Employee CollectionViewSource(即,他们可以为此客户端选择的所有雇员的列表)。

这部分工作正常,当我单击组合框时,将显示适当的员工以从组合框中选择。但是,当加载数据网格时,我希望将ClientToEmp cvs中的CurrentEmp显示为选定的员工(即,当前分配给此客户端的员工)。当他们单击它时,他们应该能够更改Employee(来自单独的员工cvs),然后将更新ClientToEmp cvs中的值。

<DataGrid Name="ClientToEmpMDG" ItemsSource="{Binding cvsClientToEmp}" 
                      AutoGenerateColumns="False" AutoGeneratingColumn="Gen_AutoGridColumns">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding ClientName}" Header="Client Name" IsReadOnly="True"/>
                    <DataGridTemplateColumn Header="Current Emp">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding Path=DataContext.cvsEmp, RelativeSource={RelativeSource AncestorType=Window}}"
                                          DisplayMemberPath="DisplayName"
                                          SelectedValuePath="User_ID"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>

                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="Start Date">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <DatePicker Name="StartDateDP" SelectedDate="{Binding Path=Start_Date}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="End Date">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <DatePicker Name="EndDateDP" SelectedDate="{Binding Path=End_Date}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

如何使当前员工在负载下正常显示?所选值应与两个ObservableCollections中的User_ID相匹配。如果我使用SelectedValue属性,则网格中的所有组合框都显示相同的值,并且它仍未正确绑定到我希望绑定到的cvsClientToEmp值。我希望每个组合框都具有自己的价值,而不是让所有组合共享一个单一的价值。

更新:我通过将“ IsSynchronizedWithCurrentItem”添加到False来解决了所有组合框显示相同值的问题...仍然无法使它绑定到从DB返回的值上,即当前雇员是谁

1 个答案:

答案 0 :(得分:0)

您在SelectedValue中缺少ComboBox

<ComboBox ItemsSource="{Binding Path=DataContext.cvsEmp, RelativeSource={RelativeSource AncestorType=Window}}"
    DisplayMemberPath="DisplayName"
    SelectedValue="{Binding CurrentEmp}"
    SelectedValuePath="User_ID"/>

另请参见https://stackoverflow.com/a/4902454/10718884


注意:还有一个DataGridComboBoxColumn

<DataGridComboBoxColumn
    ItemsSource="{Binding Path=DataContext.cvsEmp, RelativeSource={RelativeSource AncestorType=Window}}"
    DisplayMemberPath="DisplayName"
    SelectedValueBinding="{Binding CurrentEmp}"
    SelectedValuePath="User_ID">
</DataGridComboBoxColumn>