非同期でモデルの検証を実行する
非同期でモデルの検証を実行することができます。実行するには以下のような方法を用います。
IModel
オブジェクトのCreateAsyncValidationContext
メソッドを呼び出し、IAsyncValidationContext
オブジェクト(非同期検証コンテキスト)を生成します。- 生成した
IAsyncValidationContext
オブジェクトのValidateAsync
メソッドを呼び出し、非同期でモデルの検証を実行します。 - 検証で追加されたエラー情報は、
IAsyncValidationContext
オブジェクトのResult
プロパティに含まれています。画面にエラー情報を反映させたい場合は、取得したエラー情報を引数に指定して、UIスレッドでIErrors
オブジェクトのAddErrors
メソッドを呼び出します。
using System.Threading.Tasks;
public void ValidateAsync(ICommandContext c, ICommandParams p)
{
IModel model = c.App.Workspace.CurrentModel;
if (model == null)
{
return;
}
// 非同期検証コンテキストを生成します
IAsyncValidationContext asyncValidationContext = model.CreateAsyncValidationContext();
Task.Run(async () =>
{
// 非同期でモデルの検証を実行します
await asyncValidationContext.ValidateAsync();
if (!asyncValidationContext.Result.IsCanceled && !asyncValidationContext.Result.Failed)
{
// 非同期で処理を実行しているため、Dispatcherクラスを利用し、UIスレッドで処理を実行します
System.Windows.Application.Current.Dispatcher.Invoke(() =>
{
IErrorCollection errors = asyncValidationContext.Result.Errors;
c.App.Workspace.Errors.AddErrors(errors);
});
}
});
}
備考
IAsyncValidationContext
オブジェクトを生成する際に、ValidationOptions
オブジェクト(検証オプション)を指定することで検証内容をカスタマイズすることが可能です。
また、生成したIAsyncValidationContext
オブジェクトのRegisterOnModelValidate
メソッド等で独自の検証を定義することも可能です。