проблемы с правилом валидации - PullRequest
0 голосов
/ 29 июля 2010

Я пытаюсь получить правило проверки для возврата ошибки.Я реализовал IDataErrorInfo в моей модели, которая содержит свойства моего бизнес-объекта и сообщения, возвращаемые в случае сбоя проверки.Я также создал правило проверки.Проблема заключается в том, что правило проверки срабатывает (добавило его в закладки), но ссылка IDataErrorInfo в правиле никогда не имеет ошибки, даже если реализация IDataErrorInfo моей модели генерирует ее.Сетка данных определенно показывает, что произошла ошибка проверки.

Я проверил его, когда правило и модель возвращают два разных сообщения, а версия модели всегда возвращается.Как будто мое правило не может видеть, что находится в объекте IDataErrorInfo, или оно просто создает его новый экземпляр.

DataGrid:

<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
}

1 Ответ

1 голос
/ 29 июля 2010

Объект IDataErrorInfo, который получает правило, будет экземпляром вашего объекта ProjectExpenseItemsBO.Единственное свойство, которое вы проверяете, - это Error, которую вы реализовали для возврата this[string.Empty], которая всегда будет возвращать string.Empty.Возможно, вы захотите либо изменить реализацию свойства Error, чтобы просмотреть все ошибки в объекте, либо чтобы RowDataInfoValidationRule перебирал свойства и получал сообщение об ошибке для каждого из них через индексатор.

Вы получаете ошибки проверки из модели, потому что для привязки к ItemNumber для ValidatesOnDataErrors установлено значение True, поэтому платформа вызовет индексатор с именем свойства ItemNumber и получит сообщение об ошибке.

...