0

エラーを返すための検証ルールを取得しようとしています。モデルにIDataErrorInfoを実装しました。これには、検証が失敗した場合に返されるビジネスオブジェクトのプロパティとメッセージが含まれています。検証ルールも作成しました。問題は、検証ルールが実行されている(ブックマークされている)が、モデルのIDataErrorInfo実装がエラーを生成したとしても、ルール内のIDataErrorInfo参照にエラーが発生することはないということです。データグリッドは、検証に失敗したことを明確に示しています。

ルールとモデルに2つの異なるメッセージを返すようにしてテストしましたが、モデルのバージョンは常に返されます。これは、私のルールが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」は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
}
4

1 に答える 1

1

ルールが取得するIDataErrorInfoオブジェクトは、ProjectExpenseItemsBOオブジェクトのインスタンスになります。チェックする唯一のプロパティはErrorですthis[string.Empty]。これは、returnを返すように実装されており、常にstring.Emptyを返します。おそらく、Errorプロパティの実装を変更して、オブジェクト内のすべてのエラーを確認するか、RowDataInfoValidationRuleでプロパティを反復処理して、インデクサーを介して各エラーメッセージを取得する必要があります。

ItemNumberへのバインディングでValidatesOnDataErrorsがTrueに設定されているため、モデルから検証エラーが発生します。そのため、フレームワークはプロパティ名ItemNumberでインデクサーを呼び出し、エラーメッセージを取得します。

于 2010-07-29T12:31:20.230 に答える