繁体   English   中英

WPF DataGrid验证错误?

[英]WPF DataGrid Validation Bug?

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

我使用的是现成的WPF DataGrid,绑定到ObservableCollection,并尝试使用一些验证规则以提供良好的用户反馈。 毋庸置疑,还有更多的问题我无法指望,但我会坚持当下。

这是问题的摘要:

  1. ItemsSource属性绑定到ObservableCollection<T>
  2. 填充集合
  3. 以一种会导致验证错误的方式编辑网格中的项目
  4. 以编程方式从ObservableCollection<T>删除该项目

执行这些步骤后,GridView会正确识别该项目已从集合中删除,并从网格中删除该行。 但是, 网格现在陷入了无效状态,无法通过网格上的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;
    }
}

我花了几个小时试图找出正在发生的事情。 最后,对Items进行简单的刷新即可解决该问题。 希望这可以帮助。

YourDataGrid.Items.Refresh();

我遇到了同样的问题,经过漫长的搜索过程,我找到了解决方案:

您可以创建一个从DataGrid派生的类。 您可以在那里通过反射访问私有属性。 如果现在删除无效的项目,则可以调用函数SetGridWritable(),其他值可以再次编辑。

public class MyDataGrid : DataGrid
{
    public void SetGridWritable()
    {
        BindingFlags bindingFlags = BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Instance;
        PropertyInfo cellErrorInfo = this.GetType().BaseType.GetProperty("HasCellValidationError", bindingFlags);
        PropertyInfo rowErrorInfo = this.GetType().BaseType.GetProperty("HasRowValidationError", bindingFlags);
        cellErrorInfo.SetValue(this, false, null);
        rowErrorInfo.SetValue(this, false, null);
    }
}

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

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

为此,我们创建了一个带有红色边框的单元格模板,该模板与数据触发器绑定,只要给定属性的错误状态发生更改,就会触发该触发器。 数据触发的实际创建是通过依赖项属性完成的,该依赖项属性接收到ViewModel属性的绑定路径并创建绑定

即:

DataTrigger errorTrigger = CreateTrigger(CreateDirectBinding(property,new HasErrorValueConverter()), CreateErrorSetter(property));

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM