我是WPF的新手,并尝试使用DataGrid创建一个简单的应用程序。此应用程序从WebService接收Employees DataSet,并且必须允许查看和编辑数据。 DataSet包含三个表:Employees(id,Name,GenderId,PositionId),Genders(id,Name)和Positions(Id,Name)。员工表通过GenderId与Genders连接,通过PositionId与职位连接。 我已将Employees DataSet拖到窗口并获得了允许编辑项目的DataGrid。但现在它包含Position和Gender的ID,我需要ComboBoxes,它允许从可用值中选择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 Column:
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
((DataRowView)employeesDataGrid.SelectedItem).Row["GenderId"] = ((DataRowView)((ComboBox)sender).SelectedItem).Row["Id"];
}
但是,对我而言,这不是一个好习惯。而我仍然没有得到理想的结果。我认为可能有一种简单的方法来完成这项任务。
答案 0 :(得分:2)
我遇到了同样的问题,并找到了解决方案。我希望这会对某人有所帮助。 首先,您必须将DataGrid数据绑定到主表(在您的情况下为Employees):
myDataGrid.ItemsSource = dataset.Employees.DefaultView;
然后将一个组合添加到DataGrid并为其命名,例如:positionCombo。然后你必须将组合(positionCombo)的数据绑定到相关的表
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>
请注意(名称,ID)是“职位”表中的字段,“PositionId”是“员工”表中的FK。
答案 1 :(得分:0)
您可以使用DataGridTemplateColumn:
<DataGridTemplateColumn >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox >
....
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>