【发布时间】:2017-12-20 17:31:01
【问题描述】:
我的问题
我试图阻止用户在使用内置的 .NET DataGrid AddNewItem 功能时添加空的 DataGrid 行。因此,当用户尝试提交 DataGrid 的 AddNew 事务并将 PageItemViewModel.Text 留空时,它应该从 DataGrid 中消失。
代码
ViewModels
public class PageItemViewModel
{
public string Text { get; set; }
}
public class PageViewModel
{
public ObservableCollection<PageItemViewModel> PageItems { get; } = new ObservableCollection<PageItemViewModel>();
}
View
<DataGrid AutoGenerateColumns="True"
CanUserAddRows="True"
ItemsSource="{Binding PageItems}" />
我已经试过了
...在处理时从DataGrid的ItemsSource中删除自动创建的对象:
DataGrid.AddingNewItem-
INotifyCollectionChanged.CollectionChanged的PageViewModel.PageItems IEditableCollectionView.CancelNewDataGrid.OnItemsChanged
...但总是收到如下异常:
- “System.InvalidOperationException: 在 AddNew 或 EditItem 事务期间不允许‘删除’。”
- “System.InvalidOperationException:无法在 CollectionChanged 事件期间更改 ObservableCollection。”
- “System.InvalidOperationException: 使用 ItemsSource 时操作无效。请改用 ItemsControl.ItemsSource 访问和修改元素。”
我的问题
如何防止新创建的PageItemViewModel 被添加到
ObservableCollection<PageItemViewModel>,当有给定条件时(在这种情况下:String.IsNullOrWhiteSpace(PageItemViewModel.Text) == true。
编辑:
@picnic8:AddingNewItem 事件不提供任何形式的RoutedEventArgs,因此不提供Handled 属性。相反,它是AddingNewItemEventArgs。您的代码无效。
private void DataGrid_AddingNewItem(object sender, AddingNewItemEventArgs e)
{
var viewModel = (PageItemViewModel)e.NewItem;
bool cancelAddingNewItem = String.IsNullOrWhiteSpace(viewModel.Text) == true;
// ??? How can i actually stop it from here?
}
【问题讨论】:
-
你可以覆盖
OnItemsChanged。 -
@MitraM - 在覆盖的 OnItemsChanged 方法中修改集合也会导致
System.InvalidOperationException: 'Removing' is not allowed during an AddNew or EditItem transaction. -
@Maverik - 创建视图模型完美无缺。
-
@Maverik - 我明白了......但我希望 wpf 数据网格的功能有空行来创建新项目。我不想有一个我需要单击以添加新项目的按钮。
-
删除了早期的 cmets - 意识到这是一个验证问题,而不是一般的预防问题。我错过了一个关键细节。道歉。