WPF中的确定性和异步字段验证
在基于MVVM的应用程序中,我需要验证来自的数据条目中的字段。如果可能的话,我想将标准WPF验证绑定与ErrorTemplates一起使用 但是,我希望验证逻辑的执行完全由ViewModel驱动/触发(推送到视图,而不是由视图拉动),原因如下:WPF中的确定性和异步字段验证,wpf,validation,binding,mvvm,Wpf,Validation,Binding,Mvvm,在基于MVVM的应用程序中,我需要验证来自的数据条目中的字段。如果可能的话,我想将标准WPF验证绑定与ErrorTemplates一起使用 但是,我希望验证逻辑的执行完全由ViewModel驱动/触发(推送到视图,而不是由视图拉动),原因如下: 它必须异步工作,因为验证逻辑可能需要一段时间才能执行 在执行验证逻辑时,我需要更具确定性和细粒度(例如,只有在用户单击“应用”后,或者当内部状态发生变化,条目突然变得无效时) 我知道Silverlight有INotifyDataErrorInfo,它就是
我知道Silverlight有
INotifyDataErrorInfo
,它就是为了这个目的而引入的,但WPF没有。如何仍能以确定和异步方式执行验证逻辑?WPF和Silverlight的内置验证用于快速客户端验证(如正则表达式、解析值等)
如果您需要到服务器上执行验证(或者验证需要很长时间),我会用定制的方式进行。例如,单击“保存”按钮时,等等
假设您在ViewModel中有一个Save方法(您没有提到您使用的是哪个MVVM框架):
我只需在您的ViewModel中的一个操作中完成此操作所需的所有工作我在您的另一个问题上发布了一个答案,显然也回答了这个问题
你是说,我不能使用错误模板?我需要依赖于WPF和自定义控件的内置错误模板。e、 我想在一个无效的文本框周围显示标准的红色边框。如何强制显示此边框?我建议使用顶部答案建议的方法:。如果要进行长时间运行的操作,我认为使用内置验证不是一个好主意(它将始终锁定UI)。我仍然需要具体化某种“ErrorTemplate”,并在VM引发事件时显示它。由于我的一些表单不幸有很多字段,我不希望错误视觉效果立即成为视觉树的一部分,但应该仅在该字段发生验证错误时创建(例如,通过行为):请参阅我后续问题中的更多信息:似乎这是不可能的,因此,我需要走一条不同的路线,如下所述:请注意,WPF 4.5引入了与Silverlight类似的对INotifyDataErrorInfo的支持,例如:
public void Save()
{
//Do your validation, this might start a new thread (I use Async CTP myself)
//If validation is good, do your extra work, else display validation errors
}