0

DataGridでの検証に関して問題が発生しています。モデルクラスでIDataErrorInfo検証を使用しています。

問題は、別々のCellTemplateとCellEditingTemplateを持つ編集可能なDataGridにあります(注はnullではないプロパティです-検証はnullまたは空の場合にエラーを返します):

<!-- some other validated columns -->
<DataGridTemplateColumn Header="Note">
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>                                    
            <TextBox Name="textBoxNote" Text="{Binding Note, ValidatesOnDataErrors=True}" />                                    
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Note}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

[保存]ボタンで、MyObject.Error検証プロパティを確認し、nullでない場合は、MessageBoxを表示します。問題は、最初の列(注1ではない)を有効な値に変更してから[保存]ボタンをクリックすると、.Errorプロパティがnullになることです。これは、(不要ではありますが)予期される動作です。 (TextBoxコントロールは存在しませんでした!)。しかし、TextBlockでValidatesOnDataErrorsをtrueに設定すると、DataGridに表示されている(たとえばデータベースからの)すべてのオブジェクトで、気にしない不要な検証が行われます。この場合、検証にも多くの時間がかかる可能性があります...

この問題を処理する適切な方法は何でしょうか?モデルクラスで検証を維持したいと思います(オブジェクトは、それが有効かどうかを認識している必要があります)。コードビハインド([保存]ボタンイベント)で行にバインドされたオブジェクトの検証を強制する方法はありますか?または、どういうわけかオブジェクト構築の.Errorを初期化する必要がありますか?他のアイデアはありますか?

編集: 行全体(すべてのセル)を編集モード(CellEditingTemplate)にするにはどうすればよいですか?次に、すべてのコントロールがロードされ、データバインドされます。これは、検証済みも意味します...

みんなのおかげで、DB

4

1 に答える 1

0

OK、IDataErrorInfoオブジェクトを再検証することができました-一種の強制的なIDataErrorInfo検証です。それ以外の場合は、DataGridに新しいオブジェクトを追加できますが、プロパティ(編集されたものを除く)は検証されませんでした。

すべてのモデルオブジェクト(IDataErrorInfoを拡張する)のスーパークラスに、次のメソッドを追加しました。

public virtual void Revalidate() // never needed to override though
{
    Type type = this.GetType();

    // "touch" all of the properties of the object - this calls the indexer that checks
    // if property is valid and sets the object's Error property 
    foreach (PropertyInfo propertyInfo in type.GetProperties())
    {                
        var indexerProperty = this[propertyInfo.Name];
    }
}

これで、ユーザーが新しいオブジェクトをDataGridに追加するときに、myNewObject.Revalidate()メソッドを手動で呼び出して、オブジェクトをデータベースに保存する前にチェックするErrorプロパティを設定します。おそらくこれは最善の解決策ではありませんが、私にとっては非常に苦痛を伴わずに機能します。

よろしくお願いします、DB

于 2012-10-17T06:42:28.657 に答える