【发布时间】:2016-01-07 15:00:41
【问题描述】:
我有一个视图,其中一些(零个或更多)Entity 对象是从外部某处(文件、Web 服务等)加载的。我需要用户能够编辑加载的实体以及添加新行,然后才能将它们全部保存在一个事务中。在加载它们时,实体通常是无效的;在准备好持久化之前,它们都需要用户输入。为了实现这一点,视图包含一个 WPF DataGrid,其ItemsSource 是一个BindingList<Entity>,我的Entity 类实现IDataErrorInfo 以提供每个单元格的错误消息,以显示在网格的工具提示中。
当当前选定的单元格出现验证错误时,DataGrid 的默认行为是禁用编辑所有其他行以及添加新行,直到问题得到解决。这不是我想要的;用户应该能够以他/她选择的任何顺序使行有效。我可以通过从 DataGrid 继承并覆盖 OnCanExecuteBeginEdit 来使现有行可编辑:
class EditableDataGrid : DataGrid
{
protected override void OnCanExecuteBeginEdit(CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
e.Handled = true;
}
}
这可以根据需要允许编辑已经存在的行。但它仍然无法添加新行。有没有办法覆盖这种行为?或者我是否需要在 WPF 提供的之外创建自定义“验证”处理逻辑,以便就框架而言一切始终有效,只是为了避免在提供的控件中触发不必要的限制?
更新:这种行为似乎也是我在使用 DataGrid 时间歇性遇到的另一个问题的根源。我希望用户能够保存正在进行的工作并同时处理不同的“批次”实体。在这种情况下,我清除网格以为用户创建一个新的石板。但是,如果DataGrid由于验证错误已经决定不在底部创建新的占位符行,则在清除网格时仍然没有占位符行,用户无法继续。我可以尝试为此找到另一个覆盖黑客,但我真的更愿意修复底层行为(即当当前数据“无效”时停止阻止添加/编辑)。
【问题讨论】:
标签: wpf validation datagrid wpfdatagrid