【发布时间】:2011-06-29 09:02:19
【问题描述】:
这可能是预期的功能,但对我来说确实是一个错误。
我正在使用开箱即用的 WPF DataGrid,绑定到 ObservableCollection 并尝试 使用一些验证规则以提供良好的用户反馈。不用说,问题多得我数不过来,但我会坚持立即处理。
问题总结如下:
- 将
ItemsSource属性绑定到ObservableCollection<T> - 填充集合
- 以会导致验证错误的方式编辑网格中的项目
- 以编程方式从
ObservableCollection<T>中删除该项目
执行这些步骤后,GridView 会正确识别该项目已从集合中删除,并从网格中删除该行。但是,Grid 现在卡在无效状态,无法通过 Grid 上的 UI 执行进一步的操作!
再次,这对我来说似乎是一个重大错误,因为能够以编程方式从集合中删除项目是一件大事。
有人遇到过这个吗?有关如何解决它的任何建议?
值得注意的是,我创建了一个单独的解决方案来隔离这个问题,但要回答您可能有的一些问题:
你的对象是否实现了INotifyPropertyChanged? 是
这是一个自定义集合吗? 不是普通的旧 ObservableCollection<T>
你是如何从你的收藏中删除物品的?
//Find any newly added item and remove it
var someObject = SomeObjects
.Where(obj => obj.SomeProperty == SomeValue)
.First();
SomeObjects.Remove(someObject );
你是如何绑定你的验证规则的?
<DataGridTextColumn Header="SomeProperty">
<DataGridTextColumn.Binding>
<Binding Path="SomeProperty">
<Binding.ValidationRules>
<val:RequiredValidator ValidationStep="ConvertedProposedValue"
ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
你的验证规则是什么样的?
public class RequiredValidator : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null || String.IsNullOrWhiteSpace(value as String))
return new ValidationResult(false, "Field is required!");
return ValidationResult.ValidResult;
}
}
【问题讨论】:
-
我对您确切在何时何地进行移除感兴趣。
-
@SuperOli - 删除发生在保存操作期间。数据访问是 2 层,因此从网格中“删除”一个项目实际上意味着将其标记为删除。编辑是批处理的,包括已删除的项目,并在保存事件期间发送到服务器。当我从服务器取回项目列表时,我必须检查客户端以查看哪些操作成功、失败等......成功的删除操作意味着我可以从基础集合中删除项目。但是,我创建了一个简单的解决方案来独立测试,结果相同。
-
愚蠢的问题...您在删除之前修复了验证错误吗?因为在我为在此处重现您的错误而创建的应用程序中,我的单元格一直处于“编辑模式”,直到我取消更改 (ESC) 或输入有效字符串。您可能想尝试的另一件事是从 Codeplex (wpf.codeplex.com) 下载 DataGrid 源代码并参考此代码。也许这样,您就可以调试 DataGrid 状态。
-
不,验证错误在删除之前没有修复,这是问题的根源问题。删除绑定行的底层对象时,如果该行存在验证错误,则即使该行已被视觉删除,DataGrid 仍处于无效状态。
-
调试了一下,发现私有属性 DataGrid.HasCellValidationError 在删除行后仍然为“真”。它仅在提交版本时设置(更准确地说是在 DataGrid.OnExecutedCommitEdit() 中)。当此属性为真时,它会阻止进入“编辑模式”。在我看来,它看起来像一个错误,应该向 Microsoft 报告。我猜你想找到一个解决方法?
标签: c# .net wpf validation gridview