WPF DataGrid 绑定数据后,如何再动态地添加行?

小灰狼 2021-05-08 03:38:46
在 WPF 中,DataGrid 已经将一个 List<Employee> 作为数据源进行绑定,数据展示也很正常
但是我在操作界面中,需要动态地添加行,比如有一个“添加“按钮”,当点击时,在所选中的行的前面插入一行

我在被绑定的数据源 List<Employee> 中进行 Insert 操作,但是 DataGrid 并没有新增行,而是把原来所在的行覆盖
直接用 DataGrid.Items 或者 DataGrid.ItemsSource 操作也不行
...全文
952 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenxianyu.w 2023-11-27
  • 打赏
  • 举报
回复

请问你这个后面实现出来了吗?

小灰狼 2021-05-13
  • 打赏
  • 举报
回复
引用 6 楼 glb21 的回复:
绑定到DataTable上,然后修改DataTable
DataTable 不能直接赋值给 DataGrid.DataContext
glb21 2021-05-12
  • 打赏
  • 举报
回复
绑定到DataTable上,然后修改DataTable
小灰狼 2021-05-08
  • 打赏
  • 举报
回复
得到想要的,痛快给分 10分给第一个帮忙的,虽然不是想要的结果,但重在这份热情,90分给点出关键点的兄台
wang_peng 2021-05-08
  • 打赏
  • 举报
回复
List 不行, 用 ObservableCollection 试试
小灰狼 2021-05-08
  • 打赏
  • 举报
回复
引用 2 楼 morliz子轩 的回复:
1.CanUserAddRows属性 CanUserAddRows属性控制DataGrid是否显示空白行,显示空白行的情况下,用户能自行向DataGrid中添加数据。 2.InitializingNewItem事件 通过InitializingNewItem事件可以初始化空白行的默认值。

private void DataGrid_InitializingNewItem(object sender, InitializingNewItemEventArgs e)
{
	if (StuList == null || StuList.Count == 0)
	{
		((Student)e.NewItem).Id = 1;
	}
	else
	{
		((Student)e.NewItem).Id = StuList.Max(p => p.Id) + 1;
	}
	((Student)e.NewItem).Selected = true;
}
CanUserAddRows 已经被设置为 False,这是业务需求,必须禁用 关于 InitializingNewItem 事件,我这个项目里应该没必要,因为插入进来的时候,已经初始化好了 xaml 文件内容
<Window x:Class="BDM.UserGui.Test.TestDataGrid"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BDM.UserGui.Test"
		xmlns:core="clr-namespace:System;assembly=mscorlib"
		xmlns:util="clr-namespace:BDM.UserGui.Utils"
        mc:Ignorable="d"
        Title="测试" Height="250" Width="800" Loaded="Window_Loaded">
	<Window.Resources>
		<ObjectDataProvider x:Key="sexEnum" MethodName="GetValues" ObjectType="{x:Type core:Enum}">
			<ObjectDataProvider.MethodParameters>
				<x:Type Type="local:Sex1" />
			</ObjectDataProvider.MethodParameters>
		</ObjectDataProvider>
		<util:EnumBoolConverter x:Key="enumBoolConverter" />
	</Window.Resources>
    <Grid>
		<Grid.ColumnDefinitions>
			<ColumnDefinition />
		</Grid.ColumnDefinitions>
		<Grid.RowDefinitions>
			<RowDefinition />
			<RowDefinition />
		</Grid.RowDefinitions>
		<DataGrid Name="dgWorkStep" AutoGenerateColumns="False" Grid.Row="0" Grid.Column="0">
			<DataGrid.Columns>
				<DataGridTextColumn Width="60" Header="编号" Binding="{Binding Id}" IsReadOnly="True" />
				<DataGridTextColumn Width="90" Header="姓名" Binding="{Binding Name}" />
				<DataGridComboBoxColumn Width="120" Header="性别" SelectedItemBinding="{Binding Sex}" ItemsSource="{Binding Source={StaticResource sexEnum}}">
				</DataGridComboBoxColumn>
			</DataGrid.Columns>
		</DataGrid>
		<Grid Grid.Row="1" Grid.Column="0" Name="grid1">
			<Grid.ColumnDefinitions>
				<ColumnDefinition />
				<ColumnDefinition />
				<ColumnDefinition />
				<ColumnDefinition />
				<ColumnDefinition />
				<ColumnDefinition />
			</Grid.ColumnDefinitions>
			<Grid.RowDefinitions>
				<RowDefinition />
				<RowDefinition />
				<RowDefinition />
			</Grid.RowDefinitions>
			<Label HorizontalContentAlignment="Right" VerticalContentAlignment="Center" Grid.Row="0" Grid.Column="0">姓名</Label>
			<TextBox Name="txtName" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" Grid.Row="0" Grid.Column="1" Margin="3" Text="{Binding Path=Name, Mode=TwoWay}" />
			
			<Label HorizontalContentAlignment="Right" VerticalContentAlignment="Center" Grid.Row="0" Grid.Column="2">地址</Label>
			<TextBox Name="txtAddress" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" Grid.Row="0" Grid.Column="3" Margin="3" Text="{Binding Path=Address, Mode=TwoWay}" />

			<Label HorizontalContentAlignment="Right" VerticalContentAlignment="Center" Grid.Row="0" Grid.Column="4">性别</Label>
			<StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="5">
				<RadioButton Name="rbtnSexMale" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" Margin="4" IsChecked="{Binding Sex, Converter={StaticResource enumBoolConverter},ConverterParameter=1}">男</RadioButton>
				<RadioButton Name="rbtnSexFemale" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" Margin="4" IsChecked="{Binding Sex, Converter={StaticResource enumBoolConverter},ConverterParameter=2}">女</RadioButton>
			</StackPanel>

			<Button Name="btnReplace" Content="更换" Grid.Column="0" Grid.Row="1" Margin="5" Click="btnReplace_Click" />
			<Button Name="btnView" Content="查看" Grid.Column="1" Grid.Row="1" Margin="5" Click="btnView_Click" />
			<Button Name="btnAdd" Content="添加" Grid.Column="2" Grid.Row="1" Margin="5" Click="btnAdd_Click" />
		</Grid>
	</Grid>
</Window>
窗体类文件

/// <summary>
	/// TestDataGrid.xaml 的交互逻辑
	/// </summary>
	public partial class TestDataGrid : Window {

		private List<Student> studentList = null;
		public TestDataGrid() {
			InitializeComponent();
		}

		private void Window_Loaded(object sender, RoutedEventArgs e) {
			List<Student> list = new List<Student>();
			for (int i = 0; i < 4; i++) {
				Student p = new Student();
				p.Name = "学生 " + i;
				p.Sex = (i % 2 == 0) ? Sex1.男生 : Sex1.女生;
				list.Add(p);
			}
			this.studentList = list;
			this.dgWorkStep.ItemsSource = list;

			Student student = new Student();
			student.Id = 1000L;
			student.Name = "原始姓名";
			student.Address = "原住民";
			student.Sex = Sex1.女生;

			this.grid1.DataContext = student;
		}

		private void btnReplace_Click(object sender, RoutedEventArgs e) {
			Student stu = new Student();
			stu.Id = 10000L;
			stu.Name = "张三";
			stu.Address = "广东省东莞市";
			stu.Sex = Sex1.男生;

			this.grid1.DataContext = stu;
		}

		private void btnView_Click(object sender, RoutedEventArgs e) {
			Student stu = this.grid1.DataContext as Student;

			Console.WriteLine(stu.Id);
			Console.WriteLine(stu.Name);
			Console.WriteLine(stu.Address);
		}

		private void btnAdd_Click(object sender, RoutedEventArgs e) {
			Student student = new Student();
			student.Id = 1000L;
			student.Name = "新加的名字";
			student.Address = "新地址";
			student.Sex = Sex1.女生;
			this.studentList.Add(student);
		}
	}
Student 类
public class Student : INotifyPropertyChanged {

		private long? _id;
		private string _name;
		private string _address;
		private Sex1 _sex;

		private void Notify(string propName) {
			if (PropertyChanged == null)
				return;

			PropertyChanged(this, new PropertyChangedEventArgs(propName));
		}
		public long? Id {
			get {
				return _id;
			}
			set {
				_id = value;
				this.Notify("Id");
			}
		}

		public string Name {
			get {
				return _name;
			}
			set {
				_name = value;
				this.Notify("Name");
			}
		}

		public string Address {
			get {
				return _address;
			}
			set {
				_address = value;
				this.Notify("Address");
			}
		}

		public Sex1 Sex {
			get {
				return _sex;
			}
			set {
				_sex = value;
				this.Notify("Sex");
			}
		}

		public event PropertyChangedEventHandler PropertyChanged;
	}
morliz子轩 2021-05-08
  • 打赏
  • 举报
回复
1.CanUserAddRows属性 CanUserAddRows属性控制DataGrid是否显示空白行,显示空白行的情况下,用户能自行向DataGrid中添加数据。 2.InitializingNewItem事件 通过InitializingNewItem事件可以初始化空白行的默认值。

private void DataGrid_InitializingNewItem(object sender, InitializingNewItemEventArgs e)
{
	if (StuList == null || StuList.Count == 0)
	{
		((Student)e.NewItem).Id = 1;
	}
	else
	{
		((Student)e.NewItem).Id = StuList.Max(p => p.Id) + 1;
	}
	((Student)e.NewItem).Selected = true;
}
小灰狼 2021-05-08
  • 打赏
  • 举报
回复
自己顶一下 是因为周六了没人吗?

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧