MVVM 如何捕获当前页面内产生的校验异常

最近的做个功能,当界面内textbox校验异常时,按钮不可用,网上关于WPF数据校验的文章很多,此处就不在介绍,关于如何捕获校验异常的文章却很多少,本文将介绍如何获取当前页面内产生的校验异常。

1.获取控件异常

这一步其实很简单,Validation提供了一个静态方法,可以直接获取控件是否有验证错误。

System.Windows.Controls.Validation.GetHasError(child)

2.获取页面内所需所有子控件的异常

此处我写了一个扩展方法,obj可以是UserControl也可以是Window,typename是要获取异常的控件类型

public static bool GetChildIsError(this DependencyObject obj, Type typename) 
        {
            DependencyObject child = null;
            bool isError = false;
            try
            {
                for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
                {
                    child = VisualTreeHelper.GetChild(obj, i);

                    if ((child.GetType() == typename))
                    {
                        if (System.Windows.Controls.Validation.GetHasError(child))
                        {
                            return true;
                        }
                    }
                    if (GetChildIsError(child, typename))
                    {
                        return true;
                    }
                }
            }
            catch (Exception)
            {
                return false; ;
            }
            
            return isError;
        }

3.MVVM中实现校验验证

3.1ViewModel中添加属性CurrentDependencyObject,CurrentDependencyObject binding当前界面或者控件。

private DependencyObject currentDependencyObject=new DependencyObject();
public DependencyObject CurrentDependencyObject
{
      get { return currentDependencyObject; }
      set { currentDependencyObject=value;  }
}

3.2在实现ICommand接口的Command类中的CanExecute方法中验证。

protected bool CheckCanExecuteSave()
{

      return  !this.CurrentDependencyObject.GetChildIsError(typeof(System.Windows.Controls.TextBox));
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用MVVM架构处理一个页面多个方法的简单示例代码: ```C# // ViewModel中定义多个处理方法 public class MyViewModel : INotifyPropertyChanged { private string _name; private string _email; public string Name { get { return _name; } set { _name = value; OnPropertyChanged("Name"); } } public string Email { get { return _email; } set { _email = value; OnPropertyChanged("Email"); } } public void Save() { // 处理保存逻辑 } public void Delete() { // 处理删除逻辑 } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } // View中使用命令绑定来关联方法和UI事件 <TextBox Text="{Binding Name}" /> <TextBox Text="{Binding Email}" /> <Button Content="Save" Command="{Binding SaveCommand}" /> <Button Content="Delete" Command="{Binding DeleteCommand}" /> // ViewModel中定义命令属性 public class MyViewModel : INotifyPropertyChanged { private ICommand _saveCommand; private ICommand _deleteCommand; public ICommand SaveCommand { get { if (_saveCommand == null) { _saveCommand = new RelayCommand(param => Save(), param => CanSave()); } return _saveCommand; } } public ICommand DeleteCommand { get { if (_deleteCommand == null) { _deleteCommand = new RelayCommand(param => Delete(), param => CanDelete()); } return _deleteCommand; } } private bool CanSave() { // 处理是否可以保存的逻辑 } private bool CanDelete() { // 处理是否可以删除的逻辑 } private void Save() { // 处理保存逻辑 } private void Delete() { // 处理删除逻辑 } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` 在上面的示例代码中,我们可以看到,在ViewModel中定义了多个处理方法,包括Save和Delete方法。然后,在View中使用命令绑定将这些方法与UI事件关联起来。其中,使用了一个RelayCommand类来封装命令,这个类可以根据需要传递参数和判断命令是否可执行。通过这种方式,就可以在MVVM架构中处理一个页面多个方法的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值