【问题标题】:Remove selected row from DataGrid?从 DataGrid 中删除选定的行?
【发布时间】:2014-05-14 12:51:17
【问题描述】:

大家好,我已经研究了两天关于如何删除 wpf 数据网格中的选定行,但我发现没有任何用处。我在下面使用了PreviewKeyDown 事件处理程序,但都是徒劳的。我只想删除由用户。 我是 MVVM 模式,我的代码是:

  public ObservableCollection<VLANSPropertyClass> vlan { get; set; }
     vlan = new ObservableCollection<VLANSPropertyClass>();
      public ICommand AddVlan
        {
          get
          {
            if (_addVlan == null)
              _addVlan = new RelayCommand(() => this.AddVlans());

            return _addVlan;
          }

        }

     public ICommand RemoveVlan
        {
            get
            {
                if (_removeVlan == null)
                    _removeVlan = new RelayCommand(() => this.RemoveVlans());

                return _removeVlan;
            }

        }
   void AddVlans()
    {
          Console.WriteLine("Add vlan");
            var serial = new VLANSPropertyClass();
            serial.S_No = vlan.Count + 1;
            Console.WriteLine(serial.S_No);
            serial.vname = VlanName;
            Console.WriteLine(serial.vname);
            serial.vid = VlanID;
            Console.WriteLine(serial.vid);
            serial.ip = VlanIP1 + "." + VlanIP2 + "." + VlanIP3 + "." + VlanIP4;
            Console.WriteLine(serial.ip);
            serial.vports = SelectedVlanPort;
            vlan.Add(serial);
        }
     void RemoveVlans()
        {
            var rem = new VLANSPropertyClass();
            rem.S_No = vlan.Remove();
            rem.vname = vlan.Remove();
            rem.ip = vlan.Remove();

        }

任何人都可以为我提供解决此问题的方法吗?任何帮助都将不胜感激。

【问题讨论】:

  • DataGrid.SelectedItem 绑定到 ViewModel 中的相关属性。然后在您的 ViewModel 中为相关的Command 创建一个InputBinding,然后在命令执行代码中,只需从 ObservableCollection 中删除 SelectedItem。哦,顺便说一句,删除所有这些可怕的代码并使用正确的 DataBinding。 WPF 不是 winforms。

标签: c# wpf datagrid


【解决方案1】:

通常您在 WPF 程序中使用 MVVM 设计模式。您的DataGrid 控件的ItemsSource 属性绑定到对象的ObservableCollection。要从DataGrid 中删除一行,您只需从ObservableCollection 中删除对象即可。

如果您不知道“MVVM”是什么意思,这里是MSDN article about the Model View View-Model Design Pattern

编辑

我正在这里回复您的评论,因为回复需要的空间比评论所能容纳的空间多。

您的问题中没有包含任何 XAML,所以我假设您的 DataGrid 定义有类似的内容:

<DataGrid Name="MyDataGrid"
          ItemsSource="{Binding Path=vlan}"
          . . .>
    <DataGrid.Columns>
        . . .
    </DataGrid.Columns>
</DataGrid>

首先,您的视图模型需要VLANSPropertyClass 类型的属性来保存当前在DataGrid 中选择的项目:

public VLANSPropertyClass SelectedVlan {
    get { return iSelectedVlan; }
    set { 
        iSelectedVlan = value;
        OnPropertyChanged ("SelectedVlan" );
    }
}
private VLANSPropertyClass iSelectedVlan = null;

接下来,您必须修改 XAML 以将新属性绑定到 DataGrid's SelectedItem 属性:

<DataGrid Name="MyDataGrid"
          ItemsSource="{Binding Path=vlan}"
          SelectedValue={Binding Path=SelectedVlan}"
          . . .>
    <DataGrid.Columns>
        . . .
    </DataGrid.Columns>
</DataGrid>

那么,您的 RemoveVlans 方法应该类似于:

void RemoveVlans() {
    if ( SelectedVlan != null ) {
        vlans.Remove( SelectedVlan );
        SelectedVlan = null;
    }

这样就可以了。

【讨论】:

  • ..现在我添加了我使用 MVVM 编写的实际代码现在我想你说泰国需要修改我的 RemoveVLAN() 方法?
  • 您能否建议我将数据网格的每一行存储在任何数据结构中,如 List、ArrayList、Queue、Stack、Dictionary 等,并且每一行都像一个单独的对象一样存储。或者您喜欢建议的任何其他方式?
  • 正如我在回答中所说,使用ObservableCollection。一个ObservableCollection 本质上是一个实现INotifyCollectionChangedList。当您将实现该接口的集合绑定到 ItemsSource 之类的属性时,该集合会在您更改它时通知 WPF。然后 WPF 使用该通知自动更新显示。在 DataGrid's 列的 XAML 中,将每列绑定到 ObservableCollection's 类型参数中的类的属性。 (续)
  • 如果您需要在ObservableCollection's 类型参数的类的属性中保留对象数组,并且您想使用DataGrid's RowDetails 功能在嵌套的@987654345 中显示该数据@,将该属性设为该类型的 ObservableCollection 并将其绑定到嵌套的 DataGrid's ItemsSource 属性。
猜你喜欢
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2021-08-30
  • 2023-03-24
  • 2014-09-16
  • 2020-10-03
相关资源
最近更新 更多