WPF ValidationRules(MVVM 数据验证)

对于WPF中的验证, View验证实现起来很简单, 可以通道 Validation.ErrorEvent 冒泡传递到View的逻辑树上, 只是, 通常这样做的情况下, 我们需要为View添加事件代码监听这类错误事件, 然后进行处理。
这样做可以说是非常简单, 但是这样的硬编码的, 基本上每个模块每个功能, 你都必不可少的为其进行重复的工作, 这是一项非常枯燥且无聊的体力活!
于是, 则考虑MVVM的架构中, 如何把这种模式传递到ViewModel中, 使得前端的验证, 对于ViewModel仍然有效。
实现的原理, 如图所示:

在此之前, 对于View前端验证需要做的一些操作步骤,

  • 1.为验证的属性添加自定义验证类
  • 2.设置验证错误的通知属性 NotifyOnValidationError="True" 。 注: 如此一来, 则可以产生Validation.ErrorEvent事件
  • 3.通过自定义的 ValidationExceptionBehavior 继承于 Behavior, 用于监听 Validation.ErrorEvent 的错误事件。
  • 4.在 ValidationExceptionBehavior 中通过 AssociatedObjectde的DataContex获取到关联当前View的DataContex, 从而改变DataContext的后端验证条件。

1.设置属性自定义的验证类并添加 NotifyOnValidationError="True" 属性

                        <TextBox  Margin="15 0 10 0" 
                                 Style="{StaticResource MaterialDesignFloatingHintTextBox}"  materialDesign:HintAssist.Hint="登录名 *">
                            <TextBox.Text>
                                <Binding Path="Model.Account" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
                                    <Binding.ValidationRules>
                                        <domain:CustomizeValidationRule validationType="Str" 
                                                                        minLength="3" maxLength="10"
                                                                        errorMessage="输入长度范围 [3-10]字" 
                                                                        ValidatesOnTargetUpdated="True" />
                                    </Binding.ValidationRules>
                                </Binding>
                            </TextBox.Text>
                        </TextBox>

2.自定义 IValidationExceptionHandler 接口, ViewModel继承IValidationExceptionHandler , 用于接收前端的验证结果。

public interface IValidationExceptionHandler
    {
        /// <summary>
        /// 是否有效
        /// </summary>
        bool IsValid
        {
            get;
            set;
        }
    }

3. 自定义 ValidationExceptionBehavior, 用于监听处理View的错误事件

    /// <summary>
    /// 验证行为类,可以获得附加到的对象
    /// </summary>
    public class ValidationExceptionBehavior : Behavior<FrameworkElement>
    {
        /// <summary>
        /// 错误计数器
        /// </summary>
        private int _validationExceptionCount = 0;
        
        /// <summary>
        /// 附加对象时
        /// </summary>
        protected override void OnAttached()
        {
            //附加对象时,给对象增加一个监听验证错误事件的能力,注意该事件是冒泡的
            this.AssociatedObject.AddHandler(Validation.ErrorEvent, new EventHandler<ValidationErrorEventArgs>(this.OnValidationError));
        }
        
        #region 获取实现接口的对象

        /// <summary>
        /// 获取对象
        /// </summary>
        /// <returns></returns>
        private IValidationExceptionHandler GetValidationExceptionHandler()
        {
            if (this.AssociatedObject.DataContext is IValidationExceptionHandler)
            {
                var handler = this.AssociatedObject.DataContext as IValidationExceptionHandler;

                return handler;
            }

            return null;
        }

        #endregion
        
        #region 验证事件方法

        /// <summary>
        /// 验证事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnValidationError(object sender, ValidationErrorEventArgs e)
        {
            try
            {
                var handler = GetValidationExceptionHandler();

                var element = e.OriginalSource as UIElement;

                if (handler == null || element == null)
                    return;

                if (e.Action == ValidationErrorEventAction.Added)
                {
                    _validationExceptionCount++;
                    
                }
                else if (e.Action == ValidationErrorEventAction.Removed)
                {
                    _validationExceptionCount--;
                }
                handler.IsValid = _validationExceptionCount == 0;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion
    }

4. View容器最外层注册添加的监听错误事件 ValidationExceptionBehavior

   <i:Interaction.Behaviors>
        <domain:ValidationExceptionBehavior></domain:ValidationExceptionBehavior>
    </i:Interaction.Behaviors>

5. ViewModel 通过实现 IValidationExceptionHandler 来获取前端的验证结果

根据前端验证的结果, 正确保存, 错误进行提示

        public override void Save()
        {
            if (!this.IsValid)
            {
                MessageBox.Show("输入的格式有误,请重新输入!");
                return;
            }
            base.Save();
        }

效果:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF MVVM 中处理 DataGrid 数据有几个步骤: 1. 创建一个 ViewModel 类来管理 DataGrid 的数据。这个 ViewModel 类应该实现 INotifyPropertyChanged 接口,以便在数据改变时通知 View 更新。 2. 在 XAML 中创建 DataGrid 控件,并绑定到 ViewModel 的数据属性。可以使用 ItemsSource 属性数据集合绑定到 DataGrid。 3. 在 ViewModel 中创建一个数据集合属性,用于存储 DataGrid 的数据。这个属性应该是一个 ObservableCollection<T> 类型,其中 T 是 DataGrid 中每一行的数据模型类。 4. 在 ViewModel 中,通过命令或其他方式获取要显示在 DataGrid 中的数据,并将其添加到数据集合属性中。 5. 可以使用数据绑定和转换器来设置 DataGrid 的列样式和格式。例如,可以使用 DataGridTextColumn 来显示文本数据,或者使用 DataGridTemplateColumn 来自定义列。 6. 在 ViewModel 中,可以处理 DataGrid 中的用户交互事件,例如选中行或编辑单元格。可以使用命令来处理这些事件,并在需要时更新数据集合属性。 7. 可以在 ViewModel 中添加一些数据处理逻辑,例如排序、过滤或分页。可以通过操作数据集合属性来实现这些功能,并通过绑定更新 DataGrid。 总的来说,WPF MVVM 中处理 DataGrid 数据需要创建一个 ViewModel 类来管理数据,并通过数据绑定将其与 DataGrid 控件关联起来。然后,在 ViewModel 中处理数据的增删改查操作,并使用命令和事件处理来实现用户交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值