3

我正在使用 MVVM (prism) 开发 wpf 应用程序。

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

当用户输入一些数据时,我使用 StandardContact.PropertyChanged 处理程序来查看“保存”命令是否可以执行(即用户输入的模型数据是否有效)。问题是 StandardContact.PropertyChanged 处理程序是在 IDataErrorInfo 的验证代码之前调用的,因此“Save”命令的 CanExecute 不能正确反映该命令是否可以执行。我正在寻找的是,在 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(); 
    }
}
4

2 回答 2

0

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

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

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

然后在您的 Save.CanExecute 方法中

return IsValid;    // trigger validation on demand

HTH,
绿柱石

于 2012-04-18T02:04:54.310 回答
0

我刚刚检查了我们专有的 MVVM 库。在 ViewModels 索引器(在您的情况下是 Models 索引器)中验证了请求的属性:

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;
    }
}

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

于 2012-04-18T11:21:34.650 回答