WPF DataGrid验证错误?

Jos*_*osh 8 .net c# validation wpf gridview

这可能是预期的功能,但它确实对我来说似乎是个错误.

我正在使用开箱即用的WPF DataGrid,绑定到ObservableCollection并尝试使用一些验证规则以提供良好的用户反馈.毋庸置疑,还有比我更重要的问题,但我会坚持立即.

以下是问题的摘要:

  1. ItemsSource财产绑定到ObservableCollection<T>
  2. 填充集合
  3. 以一种会导致验证错误的方式编辑网格中的项目
  4. 以编程方式从中删除该项目 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 );
Run Code Online (Sandbox Code Playgroud)

你如何绑定验证规则?

<DataGridTextColumn Header="SomeProperty">
    <DataGridTextColumn.Binding>
        <Binding Path="SomeProperty">
            <Binding.ValidationRules>
                <val:RequiredValidator ValidationStep="ConvertedProposedValue" 
                     ValidatesOnTargetUpdated="True" />
            </Binding.ValidationRules>
        </Binding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)

您的验证规则是什么样的?

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Nig*_*ler 0

如果您有兴趣,我有一个非解决方案:

我们发现整个验证机制充满了不需要的行为。例如 - 我们希望允许用户输入无效数据,并且只标记错误。

为此,我们创建了一个带有红框的单元格模板,该模板与数据触发器绑定,每当给定属性的错误状态发生变化时就会调用该触发器。数据触发器的实际创建是通过依赖属性完成的,该属性接收 ViewModel 属性的绑定路径并创建绑定

IE:

DataTrigger errorTrigger = CreateTrigger(CreateDirectBinding(property,new HasErrorValueConverter()), CreateErrorSetter(property));
Run Code Online (Sandbox Code Playgroud)

这可以解决与验证错误相关的问题。