非同期でモデルの検証を実行する
非同期でモデルの検証を実行することができます。実行するには以下のような方法を用います。
- 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メソッド等で独自の検証を定義することも可能です。