属性更改事件和可以执行问题

本文关键字:执行 问题 事件 属性 | 更新日期: 2023-09-27 18:31:39

我正在使用MVVM(棱镜)来开发wpf应用程序。

我的一个模型类"StandardContact"的属性直接绑定到视图。我使用 IDataErrorInfo 来跟踪并通知模型是否有任何错误。如果模型中有任何错误,我会禁用"保存"命令。

当用户输入一些数据时,我使用 StandardContact.PropertyChanged 处理程序来查看是否可以执行"保存"命令(即用户输入的模型数据是否有效)。问题是 StandardContact.PropertyChanged 处理程序是在 IDataErrorInfo 的验证代码之前调用的,因此 CanExecute for "Save" 命令不能正确反映该命令是否可以执行。我正在寻找的是,在CanExecute执行之前,IDataErrorInfo验证应该运行,以便CanExecute将查询模型中的最新数据并决定是否启用它。这是我正在使用的示例代码

型:

public class StandardContact :EntityBase, IDataErrorInfo
{
    public virtual string Name 
    {
        get { return _name; }
        set { SetField(ref _name, value, () => Name); }
    }
    //...
    //Validators
    public string this[string propertyName] 
    {
        get 
        {
            string error = null;
        //....
    }

视图模型

public class SContactEditViewModel : NotificationObject, INavigationAware 
{
    //....
        StandardContact.PropertyChanged += 
            new PropertyChangedEventHandler(StandardContact_PropertyChanged);
    void StandardContact_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    {
        //Requery if command can execute
        SaveNewCommand.RaiseCanExecuteChanged(); 
    }
}

属性更改事件和可以执行问题

我刚刚检查了我们专有的 MVVM 库。在 ViewModels 索引器(在本例中为模型索引器)中,将验证请求的属性:

public string this[string propertyName]
{
    get
    {
        string result = null;
        if (CanDataErrorValidated(propertyName))
        {
            int errorCount = CurrentValidationAdapter.ErrorCount();
            result = ValidateProperty(propertyName, GetValidateValue(propertyName));
            // if the error flag has been changed after validation
            if (errorCount != CurrentValidationAdapter.ErrorCount())
            {
                RaisePropertyChanged(PropHasError);
                RaisePropertyChanged(PropError);
            }
        }
        else
        {
            RaisePropertyChanged(PropHasError);
            RaisePropertyChanged(PropError);
        }
        return result;
    }
}

因此,问题的解决方案似乎可以即时验证请求的属性。

我不使用棱镜,但如果它公开了某种 IsValid 方法或属性,您可以使用它来触发错误检查。如果没有,你可以自己写。

没有棱镜的基本思想是必须利用IDataErrorInfo.Error通过做

bool IsValid{ get{return string.IsNullOrEmpty(Error) }  // trigger validation

然后在您的 Save.CanExecute 方法中

return IsValid;    // trigger validation on demand

呵呵,
贝瑞尔