WPF Datagrid с комбинированными списками и загрузкой из DataSet - PullRequest
1 голос
/ 05 июля 2011

Я абсолютно новичок в WPF и пытаюсь создать простое приложение с помощью DataGrid. Это приложение получает набор данных сотрудников от WebService и должно разрешать просмотр и редактирование данных. DataSet содержит три таблицы: Сотрудники (id, Name, GenderId, PositionId), Genders (id, Name) и Positions (Id, Name). Таблица сотрудников, связанная с полами через GenderId и с позициями через PositionId. Я перетащил набор данных сотрудников в окно и получил DataGrid, который позволяет редактировать элементы. Но теперь он содержит идентификаторы Position и Gender, и мне нужны ComboBox, которые позволят выбрать Gender или Position из доступных значений и сохранить их обратно в DataSet. Я загружаю DataSet следующим образом:

EmployeesProxy.EmployeesServiceClient proxy = new EmployeesProxy.EmployeesServiceClient();
        proxy.ClientCredentials.UserName.UserName = "user1";
        proxy.ClientCredentials.UserName.Password = "pass1";
        empDataSet = proxy.GetEmployeesData();
        employeesDataGrid.ItemsSource = empDataSet.Employees.DefaultView;
        GenderDT = empDataSet.Gender;

        proxy.Close();

У меня есть empDataSet и GenderDT в качестве свойств в моем окне. Однако я не смог создать в XAML столбец с выпадающими списками, который позволит редактировать данные. Есть ли способ сделать это?

РЕДАКТИРОВАТЬ: Я нашел это решение, которое частично работает (я могу выбрать пол в режиме редактирования, но не могу просмотреть имя пола в обычном режиме, я вижу только Id):

<DataGridTemplateColumn Header="Gender">
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Path=GenderDT, 
                                                RelativeSource={RelativeSource FindAncestor, 
                                                AncestorType={x:Type Window}}}"  
                                  DisplayMemberPath="Name" 
                                  SelectedValuePath="Gender" SelectionChanged="ComboBox_SelectionChanged" Loaded="ComboBox_Loaded"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>                    
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=GenderId}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>                    
            </DataGridTemplateColumn>

После изменения ComboBox я меняю столбец Gender:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ((DataRowView)employeesDataGrid.SelectedItem).Row["GenderId"] = ((DataRowView)((ComboBox)sender).SelectedItem).Row["Id"];
    }

Но, как по мне, это не очень хорошая практика. И я до сих пор не получаю желаемого результата. Я думал, что может быть простой способ сделать такую ​​задачу.

Ответы [ 2 ]

2 голосов
/ 04 мая 2013

У меня та же проблема, и я нашел решение.Надеюсь, это кому-нибудь поможет.Сначала вам нужно привязать DataGrid к главной таблице (в вашем случае, Employees):

myDataGrid.ItemsSource = dataset.Employees.DefaultView;

Затем добавьте комбо к DataGrid и дайте ему имя, например: positionCombo.Затем необходимо привязать данные (combo position) к связанной таблице

positionCombo.ItemsSource = dataset.Positions.DefaultView;

. После этого вам нужно указать некоторые свойства в XAML:

<DataGrid x:Name="myDataGrid" AutoGenerateColumns="False">
   <DataGrid.Columns>
        <DataGridComboBoxColumn x:Name="positionCombo" Header="Position" DisplayMemberPath="Name" SelectedValuePath="Id" SelectedValueBinding="{Binding PositionId}"/>
   </DataGrid.Columns>
</DataGrid>

Обратите внимание, что (Name,Id) поля в вашей таблице «Позиции», а «PositionId» - это FK в вашей таблице «Сотрудники».

0 голосов
/ 05 июля 2011

Вы можете использовать DataGridTemplateColumn с чем-то вроде:

 <DataGridTemplateColumn >
                     <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                           <ComboBox >
                              ....
                           </ComboBox>
                        </DataTemplate>
                     </DataGridTemplateColumn.CellTemplate>
                  </DataGridTemplateColumn>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...