エラーを返すための検証ルールを取得しようとしています。モデルに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
}