2

DataGrid に編集機能を実装しています。典型的なセルのCellEditingTemplateは次のようになります:-

<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <TextBox Grid.Column="0" 
                 Text="{Binding Concentration, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=LostFocus}"
                 Validation.ErrorTemplate="{StaticResource errorTemplate}" />
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>

この例では、"Concentration" というプロパティにバインドされた TextBox があります。これは double 型のプロパティであり、特定の範囲内に収まることを確認するための検証が行われます。ちなみに、グリッドにバインドされているモデルは実装さIDataErrorInfoれています。

問題は、無効な値が入力されたときにエラー テンプレートによってセルが強調表示されますが、そのセル (または行) からフォーカスを移動するのを止めるものは何もないことです。データ グリッド編集で検証を処理するための推奨されるアプローチは何ですか? 有効な値が入力されるまでユーザーがセルを離れるのを防ぐことができるかどうか疑問に思いましたが、それは危険である可能性があります-有効な値が入力されるまで何もできません (アプリを閉じることさえできません)。

もう 1 つのオプションは、データグリッドに無効な行が含まれている場合にユーザーが続行できないようにすることです。しかし、これをテストする最良の方法は何ですか? IDataErrorInfo は、各行のモデルで調べることができる "IsValid" プロパティを提供しません。

最後に、ユーザーが無効なものを入力した場合、モデルのプロパティを以前の「適切な」値 (またはデフォルト値) に戻すことができます。

助言がありますか?ちなみに私はMVVMを使用しています。

4

2 に答える 2

2

これを使用して、実装の小さなスニペットである IDataerrorInfo にオブジェクトのエラーがあるかどうかを確認します。

protected Dictionary<string, string> _propertyErrors = new Dictionary<string, string>();
public bool HasErrors {
    get { return (_propertyErrors.Count) > 0; }
}

次に、このプロパティを評価した後に何をすべきかのロジックを処理できます。ナビゲーションを禁止したり、アプリを閉じたりしますか。次に、そのコードからのエラーを評価してから、そのアクションをキャンセルする必要があります。

于 2013-04-11T17:49:11.057 に答える