using Microsoft.Xaml.Behaviors; using System.Windows; using System.Windows.Controls; namespace Sai.Toolkit.Mvvm.Behaviors; /// /// 在xaml的资源中声明,viewModel继承IValidationExceptionHandler,通过IsValid判断能否执行 /// public class ValidationRuleBehavior : Behavior { private int errorCount; protected override void OnAttached() { base.OnAttached(); AssociatedObject.AddHandler(Validation.ErrorEvent, new EventHandler(OnValidationError)); } protected override void OnDetaching() { AssociatedObject.RemoveHandler(Validation.ErrorEvent, new EventHandler(OnValidationError)); } private void OnValidationError(object sender, ValidationErrorEventArgs e) { if (AssociatedObject.DataContext is IValidationExceptionHandler handler) { if (e.OriginalSource is UIElement elem) { if (e.Action == ValidationErrorEventAction.Added) { errorCount++; } else if (e.Action == ValidationErrorEventAction.Removed) { errorCount--; } } handler.IsValid = errorCount == 0; } } }