属性更改事件和可以执行问题
本文关键字:执行 问题 事件 属性 | 更新日期: 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
呵呵,
贝瑞尔