如何在ViewModel中处理Validation.Error而不是我后面的View代码?

我正在尝试让WPFvalidation在MVVM模式中工作。

在我的视图中,我可以validation像这样的TextBox,它由代码隐藏方法“HandleError”处理,工作正常:

         

但是,我想通过DelegateCommand在我的ViewModel中处理validation,但是当我使用以下代码尝试它时,我得到显式错误“ ‘{Binding HandleErrorCommand}’不是有效的事件处理程序方法名。只有实例方法生成的或代码隐藏的类是有效的。

有没有解决方法,以便我们可以在MVVM模式中处理validation?

视图:

          

视图模型:

 #region DelegateCommand: HandleError private DelegateCommand handleErrorCommand; public ICommand HandleErrorCommand { get { if (handleErrorCommand == null) { handleErrorCommand = new DelegateCommand(HandleError, CanHandleError); } return handleErrorCommand; } } private void HandleError() { MessageBox.Show("in view model"); } private bool CanHandleError() { return true; } #endregion 

我不知道这会对你有所帮助,但我会一直提供。

另外,我使用的是Silverlight,而不是WPF。

我没有在我的视图中指定任何validation,也没有在后面的代码和xaml中指定。 My View仅包含ViewModel上属性的数据绑定。

我的所有错误检查/validation都由ViewModel处理。 当我遇到错误时,我设置了一个ErrorMessage属性,该属性也绑定到视图。 ErrorMessage文本块(在视图中)有一个值转换器,如果错误为空或空,则隐藏它。

以这种方式执行操作可以轻松地对输入validation进行unit testing。

这是使用Expression Blend 3行为执行此操作的方法。 我写了一个ValidationErrorEventTrigger,因为内置的EventTrigger不能用于附加的事件。

视图:

              

ViewModel 🙁可以保持不变,但是这里看看我如何在使用exceptionvalidation规则时挖掘validation参数以查找错误消息)

  public ICommand HandleErrorCommand { get { if (_handleErrorCommand == null) _handleErrorCommand = new RelayCommand(param => OnDisplayError(param)); return _handleErrorCommand; } } private void OnDisplayError(object param) { string message = "Error!"; var errorArgs = param as ValidationErrorEventArgs; if (errorArgs != null) { var exception = errorArgs.Error.Exception; while (exception != null) { message = exception.Message; exception = exception.InnerException; } } Status = message; } 

ValidationErrorEventTrigger:

 public class ValidationErrorEventTrigger : EventTriggerBase { protected override void OnAttached() { Behavior behavior = base.AssociatedObject as Behavior; FrameworkElement associatedElement = base.AssociatedObject as FrameworkElement; if (behavior != null) { associatedElement = ((IAttachedObject)behavior).AssociatedObject as FrameworkElement; } if (associatedElement == null) { throw new ArgumentException("Validation Error Event trigger can only be associated to framework elements"); } associatedElement.AddHandler(Validation.ErrorEvent, new RoutedEventHandler(this.OnValidationError)); } void OnValidationError(object sender, RoutedEventArgs args) { base.OnEvent(args); } protected override string GetEventName() { return Validation.ErrorEvent.Name; } }