【问题标题】:problems with validation rule验证规则的问题
【发布时间】:2010-07-28 20:22:22
【问题描述】:

我正在尝试获取验证规则以返回错误。我在我的模型中实现了 IDataErrorInfo,其中包含我的业务对象属性和在事件验证失败时返回的消息。我还创建了一个验证规则。问题是,验证规则正在触发(为它添加书签),但规则中的 IDataErrorInfo 引用从来没有错误,即使我的模型的 IDataErrorInfo 实现生成了一个错误。数据网格肯定显示验证失败。

我通过让规则和模型返回两条不同的消息来测试它,并且总是返回模型的版本。就像我的规则看不到 IDataErrorInfo 对象中的内容,或者它只是在创建它的新实例。

数据网格:

<DataGrid ItemsSource="{Binding Path=ProjectExpenseItemsCollection}" AutoGenerateColumns="False" 
    Name="dgProjectExpenseItems" RowStyle="{StaticResource RowStyle}" 
    SelectedItem="{Binding Path=SelectedProjectExpenseItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    CanUserDeleteRows="True" CanUserAddRows="True">
    <DataGrid.RowValidationRules>
        <vr:RowDataInfoValidationRule ValidationStep="UpdatedValue" />
    </DataGrid.RowValidationRules>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Item Number" 
            Binding="{Binding ItemNumber, Mode=TwoWay, 
            UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
    </DataGrid.Columns>
</DataGrid>

验证规则:

对象 "idei" 不为空,但 idei.Error 始终是零长度字符串 ("")

public class RowDataInfoValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        BindingGroup bindingGroup = (BindingGroup)value;
        IDataErrorInfo idei = bindingGroup.Items[0] as IDataErrorInfo;
        string error = (idei != null) ? idei.Error : null; 
        return (string.IsNullOrEmpty(error)) ? ValidationResult.ValidResult : new ValidationResult(false, error + ": ValidationRule");
    }
}

模型/业务对象

public class ProjectExpenseItemsBO : IDataErrorInfo, IEditableObject, INotifyPropertyChanged
{
    public string ItemNumber { get; set; }

    public ProjectExpenseItemsBO() {}

    // string method
    static bool IsStringMissing(string value)
    {
        return String.IsNullOrEmpty(value) || value.Trim() == String.Empty;
    }

    #region IDataErrorInfo Members

    public string Error
    {
        get { return this[string.Empty]; }
    }

    public string this[string propertyName]
    {
        get
        {
            string result = string.Empty;
            if (propertyName == "ItemNumber")
            {
                if (IsStringMissing(this.ItemNumber))
                {
                    result = "Item number cannot be empty-IDataError!";
                }
            }

            return result;
        }
    }

    #endregion
}

【问题讨论】:

    标签: wpf idataerrorinfo validationrules


    【解决方案1】:

    规则获取的 IDataErrorInfo 对象将是您的 ProjectExpenseItemsBO 对象的一个​​实例。您检查的唯一属性是 Error,您已实现该属性以返回 this[string.Empty],它将始终返回 string.Empty。您可能想要更改 Error 属性的实现以查看对象中的所有错误,或者让 RowDataInfoValidationRule 遍历属性并通过索引器获取每个错误消息。

    您从模型中收到验证错误,因为您与 ItemNumber 的绑定已将 ValidatesOnDataErrors 设置为 True,因此框架将使用属性名称 ItemNumber 调用索引器并获取您的错误消息。

    【讨论】:

    • 这完全有道理,我觉得有点愚蠢,因为没有看到这一点(newbee)。我添加了传递错误所需的代码,它正在工作!至于您的第二个答案,即使我的 VR 可以访问错误,dg 仍在寻找模型中的 IDEI 以获取其消息和验证结果?在这种情况下,如何获得覆盖 IDEI 的规则?修复错误后,我试图让 VR 清除 dg 中的验证错误,但只有在对 dg 进行排序或刷新时才能这样做。我认为让 VR 将结果设置为 ValidResult 会清除错误。顺便说一句,谢谢!
    • 让我纠正一些事情。我不一定要覆盖模型中来自 IDEI 的错误——这实际上是出于测试目的——我想做的是在用户纠正错误时清除网格中的验证错误,除非我排序,否则不会发生或者刷新dg。
    • 好的,我现在明白了。因为我的 dg 中的列将 ValidatesOnDataErrors 设置为 true,所以它将忽略 VR 的结果。我从列中删除了它,现在每个都工作正常。我以为我可以将它们相互结合使用,但它似乎是一个非此即彼的事情。这一切都是为了在纠正错误时从 dg 中清除错误。在这种情况下,似乎 VR 可以做到,而 IDEI 不能,至少在不刷新 dg 的情况下不能。
    • 还有一件事 Quartermeister。我真的要感谢你的回复!我已经尝试解决这个问题大约两三周了。
    • @steveareeno:我认为 DataGrid 在处理验证方面存在一些错误。有关问题的描述,请参阅 wpf.codeplex.com/wikipage?title=Validation。这篇文章似乎有一些解决方法,但我还没有真正尝试过:codeproject.com/KB/WPF/WPFDataGridExamples.aspx#validation.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多