如何在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
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; } }