メインコンテンツまでスキップ

非同期でモデルの検証を実行する

非同期でモデルの検証を実行することができます。実行するには以下のような方法を用います。

  1. IModelオブジェクトのCreateAsyncValidationContextメソッドを呼び出し、IAsyncValidationContextオブジェクト(非同期検証コンテキスト)を生成します。
  2. 生成したIAsyncValidationContextオブジェクトのValidateAsyncメソッドを呼び出し、非同期でモデルの検証を実行します。
  3. 検証で追加されたエラー情報は、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メソッド等で独自の検証を定義することも可能です。