Wpf中点击添加新增在DataGrid控件中的当前选中行下添加新的一行空白行或追加一行

博客介绍了在列表选中的当前行下一行添加新行的方法。可通过给集合Add一行数据,默认添加到泛型集合最后一行;也可用Inset(索引+1,数据源)按选中行添加。实现需获取DataGrid选中索引,通过Binding字段获取索引后,调用ViewModel中的Add命令添加。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

列表中在选中的当前行的下一行添加新的一行(追加一行)

      解释:做添加的意思也就是给集合Add一行数据,这个Add也就是默认会添加到泛型集合的最后一行

      解释:1: Add(数据源);

                 2:方法换成Inset(索引+1,数据源);这实现按选中行添加。其中参数 :索引+1代表的意思是,选中行加1,也就                           是在当前选中行下去添加一行数据

 

 

实现过程:

1:如果做这个功能是不是要在获取控件的行号啊。

2:获取行号?

3:再想想,如如果我获取当前选中行的索引的话是不是可以按照索引添加1(在当前选中行下面添加一行)去实现效果?(也就是:当前行的索引数+1)

 

     首先我要获取DataGrid的选中索引:SelectedIndex 获取索引 Binding的是ViewModel的一个ing类型字段。把索引获取到。

 

在View页面的DataGrid控件新加一个SelectedIndex来获取当前的选中索引:所Binding的DataGridIndex是在ViewModel中添加的一个可监听属性变化的字段(int类型)


 <DataGrid  x:Name="MetroDataGrid" Grid.Row="1" Grid.Column="0"
                  RenderOptions.ClearTypeHint="Enabled"
                  TextOptions.TextFormattingMode="Display"
                  Margin="5"
                  RowHeaderWidth="40"
                  IsSynchronizedWithCurrentItem="True"
                  GridLinesVisibility="All"
                  HeadersVisibility="All"
                  SelectionUnit="FullRow"
                  SelectedIndex="{Binding DataGridIndex,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/*这个是获取的当前索引*/
                  ItemsSource="{Binding Path=Items}"/>

加上断点看了下ViewModel中的这个Binding字段DataGridIndex获取到选中行的索引了。因为我添加是调用的ViewModel中的Add的Command命令。

添加命令:


 private Void Add()
  {
        #region 在控件当前选中行下一行追加一行
        int selectIndex = DataGridIndex;
        if (selectIndex == 0)       // 如果没有选中行就默认添加,添加到最后一行
        {
           Items.Add(newInstance);
        }
         else                       // 有选中行,把获取过来的选中索引基础上+1 
        {
           Items.Insert(selectIndex + 1, newInstance);
        }
          this.CurrentItem = newInstance;
          MoveScrollbarToCurrentPosition(this.CurrentItem);
          this.IsEditEnable = true;

         #endregion
     
 }

 

在C# WPF MVVM架构中,要为DataGrid控件实现自动添加序号的功能,通常需要结合数据绑定和命令模式。以下是一个简单的步骤: 1. **创建ViewModel**: 在ViewModel中,你可以定义一个ObservableCollection作为数据源,这个集合会在增加元素时自动更新。 ```csharp public class MyViewModel : INotifyPropertyChanged { private ObservableCollection<MyRowModel> dataRows = new ObservableCollection<MyRowModel>(); public ObservableCollection<MyRowModel> DataRows { get { return dataRows; } set { if (value != dataRows) { dataRows = value; OnPropertyChanged("DataRows"); } } } // ... 其他属性和方法 public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` 2. **RowDetailsTemplate**: 在DataGrid的`RowDetailsTemplate`中,你可以设置一个TextBlock用于显示序号。将TextBlock的数据模板绑定到索引。 ```xaml <DataGrid ItemsSource="{Binding DataRows}"> <DataGrid.Columns> <!--其他列...--> </DataGrid.Columns> <DataGrid.RowDetailsTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="序号:" /> <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridItem}}, Path=Index}" /> </StackPanel> </DataTemplate> </DataGrid.RowDetailsTemplate> </DataGrid> ``` 3. **数据模型**: 如果需要,可以在`MyRowModel`中添加一个索引字段,虽然DataGrid会自动维护序号,但如果你的数据模型需要它,可以自定义。 4. **MVVM交互**: 在View层,你可以通过Command者EventToCommand库来处理添加的操作,同时更新ViewModel的DataRows。 以上就是基本的实现步骤,当然,具体的MVVM框架如MVVMLight、Caliburn.Micro等可能会有所不同,但核心思想是一致的:通过双向数据绑定和命令模式处理视图和模型之间的交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值