Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF中的确定性和异步字段验证_Wpf_Validation_Binding_Mvvm - Fatal编程技术网

WPF中的确定性和异步字段验证

WPF中的确定性和异步字段验证,wpf,validation,binding,mvvm,Wpf,Validation,Binding,Mvvm,在基于MVVM的应用程序中,我需要验证来自的数据条目中的字段。如果可能的话,我想将标准WPF验证绑定与ErrorTemplates一起使用 但是,我希望验证逻辑的执行完全由ViewModel驱动/触发(推送到视图,而不是由视图拉动),原因如下: 它必须异步工作,因为验证逻辑可能需要一段时间才能执行 在执行验证逻辑时,我需要更具确定性和细粒度(例如,只有在用户单击“应用”后,或者当内部状态发生变化,条目突然变得无效时) 我知道Silverlight有INotifyDataErrorInfo,它就是

在基于MVVM的应用程序中,我需要验证来自的数据条目中的字段。如果可能的话,我想将标准WPF验证绑定与ErrorTemplates一起使用

但是,我希望验证逻辑的执行完全由ViewModel驱动/触发(推送到视图,而不是由视图拉动),原因如下:

  • 它必须异步工作,因为验证逻辑可能需要一段时间才能执行
  • 在执行验证逻辑时,我需要更具确定性和细粒度(例如,只有在用户单击“应用”后,或者当内部状态发生变化,条目突然变得无效时)

  • 我知道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
    }