0

我正在使用 DataGrid 向用户显示数据。

我允许用户编辑数据并添加新行。是否可以使用内置的功能CanUserDeleteRows来允许用户仅删除他刚刚添加的行。

所以用例描述:

1) 用户打开数据网格 2) 数据网格显示其内容 3) 用户添加了几行 4) 用户删除了他添加的一个(或全部)行。5) 用户无法删除最初加载时数据网格中的行

...所以只有“新”行应该能够被删除。什么方法在这里最好?我现在有点没有想法......

更新:为了满足您的意见;)

我正在使用自定义类的 ObservableCollection 来填充数据网格。所以“问题”是我实际上不知道如何“拦截”删除事件,也不知道如何在不破坏 mvvm 模式的情况下做到这一点。

4

2 回答 2

0

你有两个选择:

1 `Disconnected Mode`

您将新行保存在缓存中,您使用GetChanges方法来获取添加的行。

//GetChanges return added rows before update datasource from caching
var newRows = YourDataTable.GetChanges(DataRowState.Added);

您添加另一个数据列,每次添加新行时都设置此列的值。

DataColumn columnFlag = new DataColumn("FlagDelete", typeof(bool));

Delete Buttonvisible根据列值

‎</p>

2 `Connected Mode` 

您在数据库中创建新列,实现服务器调用以获取数据,并根据列标志的值可视化您的函数删除

于 2012-10-01T15:52:01.613 回答
0

当我使用 ObservableCollections 等时,我使用了一种工作方法,有点基于 Aghilas Yakoub 的回答。

我向 DataGrid 添加了一个 Remove-Button,其可见性绑定到一个IsNew-Property。

<DataGridTemplateColumn>
   <DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
          <Button Content="Remove" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabControl}}, Path=DataContext.BottomDetailVM.DeleteCommand}" Visibility="{Binding IsNew, Converter={StaticResource Bool2VisibilityConverter}, FallbackValue=Collapsed}" CommandParameter="{Binding}" />
      </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

当用户单击按钮时,以当前对象(显示在行中)作为参数执行命令。

public ICommand DeleteRangfolgeCommand
{
  get
  {
     return new ActionCommand<MyOwnViewModel>(ExecuteDelete);
  }
}

private void ExecuteDelete(MyOwnViewModel viewModelToDelete)
{
    this.ItemsSourceList.Remove(viewModelToDelete);
}

顺便说一句:我正在使用MSDN-MagazineRelayCommand中的-implementation(在我的例子中称为 ActionCommand)。

于 2012-10-05T10:38:28.977 回答