繁体   English   中英

WPF 4.5中的INotifyDataErrorInfo和异步数据验证

[英]INotifyDataErrorInfo and asynchronous data validation in WPF 4.5

是否允许从非UI线程触发ErrorsChanged事件? 我正在看以下文章:

使用INotifyErrorDataError接口验证WPF 4.5中的数据

特别是,我有一个关于此代码片段的问题:

private async void ValidateUsername(string username)
{
    const string  propertyKey = "Username";
    ICollection<string> validationErrors = null;
    /* Call service asynchronously */
    bool isValid = await Task<bool>.Run(() => 
    { 
        return _service.ValidateUsername(username, out validationErrors); 
    })
    .ConfigureAwait(false);

    if (!isValid)
    {
        /* Update the collection in the dictionary returned by the GetErrors method */
        _validationErrors[propertyKey] = validationErrors;

        /* Raise event to tell WPF to execute the GetErrors method */
        RaiseErrorsChanged(propertyKey);
    }
    else if(_validationErrors.ContainsKey(propertyKey))
    {
        /* Remove all errors for this property */
        _validationErrors.Remove(propertyKey);

        /* Raise event to tell WPF to execute the GetErrors method */
        RaiseErrorsChanged(propertyKey);
    }
} 

注意在等待Task<bool>.Run之后,如何使用ConfigureAwait(false)允许在池线程上继续:

这很可能会导致在非UI线程上触发ErrorsChanged事件。 这与MSDN相反:

只要GetErrors返回值发生更改,实现类就应该在用户界面线程上引发此事件,即使返回值实现了INotifyCollectionChanged

这篇文章似乎来自一个可靠的来源,显然代码已经过测试。

我错过了什么吗? 这是一个错误,或WPF 4.5是否与此相关, 类似于PropertyChanged

我认为这是一个错误。 然后,我总是在UI线程上提出PropertyChanged ; 因为即使WPF碰巧处理它,其他MVVM框架也可能不会。

当然,理想情况下,服务将是异步的(因为它是I / O绑定的),在这种情况下,也不需要Task.Run 哦,并且示例当前使用async void方法,如果发生任何不幸事件(例如,如果验证服务不可用),则会引发应用程序级错误。

此外,无论何时您使用用户的输入执行异步操作,您都需要考虑有关延迟和错误的用户体验。 特别是,我更喜欢一种显示内联忙指示符的解决方案,以便用户知道该字段正在被验证。 然后它可以在验证完成时更改为绿色检查或红色x或其他内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM