验证规则的问题

时间:2010-07-28 20:22:23

标签: wpf idataerrorinfo validationrules

我正在尝试获取验证规则以返回错误。我在我的模型中实现了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”不为null,但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
}

1 个答案:

答案 0 :(得分:1)

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

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