Using WPF Validation rules and the disabling of a 'Save' button

前端 未结 10 2095
眼角桃花
眼角桃花 2020-11-28 09:54

I have a page where a few textboxes cannot be empty before clicking a Save button.


                            


        
10条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-28 10:33

    Here is a helper method which tracks validation errors on the dependency objects (and all its children) and calls delegate to notify about the change. It also tracks removal of the children with validation errors.

     public static void AddErrorHandler(DependencyObject element, Action setHasValidationErrors)
            {
                var errors = new List>();
    
                RoutedEventHandler sourceUnloaded = null;
    
                sourceUnloaded = (sender, args) =>
                    {
                        if (sender is FrameworkElement)
                            ((FrameworkElement) sender).Unloaded -= sourceUnloaded;
                        else
                            ((FrameworkContentElement) sender).Unloaded -= sourceUnloaded;
    
                        foreach (var error in errors.Where(err => err.Item1 == sender).ToArray())
                            errors.Remove(error);
    
                        setHasValidationErrors(errors.Any());
                    };
    
                EventHandler errorHandler = (_, args) =>
                    {
                        if (args.Action == ValidationErrorEventAction.Added)
                        {
                            errors.Add(new Tuple(args.OriginalSource, args.Error));
    
                            if (args.OriginalSource is FrameworkElement)
                                ((FrameworkElement)args.OriginalSource).Unloaded += sourceUnloaded;
                            else if (args.OriginalSource is FrameworkContentElement)
                                ((FrameworkContentElement)args.OriginalSource).Unloaded += sourceUnloaded;
                        }
                        else
                        {
                            var error = errors
                                .FirstOrDefault(err => err.Item1 == args.OriginalSource && err.Item2 == args.Error);
    
                            if (error != null) 
                                errors.Remove(error);
                        }
    
                        setHasValidationErrors(errors.Any());
                    };
    
    
                System.Windows.Controls.Validation.AddErrorHandler(element, errorHandler);
            } 
    

提交回复
热议问题