Привязка WPF DataGrid Combobox к данным о нагрузке с отдельным ItemsSource - PullRequest
0 голосов
/ 09 января 2019

У меня есть небольшое затруднение, которое я не смог разрешить, по крайней мере, в методе, который имеет смысл с точки зрения MVVM.

У меня есть сетка данных, которая содержит данные клиент-сотрудник с датами начала и окончания для каждого отношения клиент-сотрудник.

Общий DataSrid DataGrid - это ClientToEmp CollectionViewSource, связанный с ClientToEmpObservableCollection. Однако в столбце комбинированного списка, который позволяет им изменять / обновлять текущего сотрудника, ItemsSource - это Employee CollectionViewSource, связанный с User ObservableCollection (т. Е. Список всех сотрудников, которых они могут выбрать для этого клиента).

Эта часть работает нормально, когда я нажимаю на поле со списком, в списке отображаются нужные сотрудники для выбора. Однако, когда загружается сетка данных, я хочу, чтобы CurrentEmp из cvs ClientToEmp показывался как выбранный сотрудник (т. Е. Сотрудник, который в настоящее время назначен этому клиенту). Когда они щелкают по нему, они должны иметь возможность изменить Employee (из отдельных cvs employee), что затем обновит значение в 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>

Как заставить нынешнего сотрудника правильно отображаться при загрузке? Выбранное значение должно соответствовать User_ID из двух ObservableCollections. Если я использую свойство SelectedValue, все выпадающие списки в сетке показывают одно и то же значение, и оно по-прежнему не привязывается должным образом к значению cvsClientToEmp, к которому я хочу привязать его. Я хочу, чтобы у каждого выпадающего списка была своя собственная ценность, а не у всех их было одно значение.

ОБНОВЛЕНИЕ: я исправил проблему, когда все комбинированные списки отображали одно и то же значение, изменив добавление «IsSynchronizedWithCurrentItem» на False ... Все еще не могу связать его со значением, возвращаемым из БД, в отношении того, кто является текущим сотрудником.

1 Ответ

0 голосов
/ 09 января 2019

Вам не хватает 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...