我在 sqlserver 中有一个表,其中包含一些行。我在 wpf 和一些文本框中有一个 prism MVVM 项目,其中每个文本框的文本都绑定到我的表的属性。例如在视图中:
Text="{Binding UserModel.Fname, UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True, Mode=TwoWay}"
和一个带有命令的按钮:
Command="{Binding Add_EditUserInfo}"
在 Viewmodel 中,我的表有一个属性:
private TblUserInfo _userModel = new TblUserInfo();
public TblUserInfo UserModel
{
get { return _userModel; }
set
{
SetProperty(ref _userModel, value);
Add_EditUserInfo.RaiseCanExecuteChanged();
}
}
按钮:
public DelegateCommand Add_EditUserInfo { get; set; }
。 。 。 并在构造函数中:
Add_EditUserInfo = new DelegateCommand(OnAdd_EditUserInfo, CanAdd_EditUserInfo).ObservesProperty(() => UserModel);
对于可以执行:
private bool CanAdd_EditUserInfo()
{
return UserModel.TblUserInfo_IsValid;
}
现在,我的问题: 当我在文本框中写入一些内容时,canExecute 命令未触发。 为什么?
您的
UserModel
属性不会改变,因此没有 RaiseCanExecuteChanged
。
您必须在
Fname
的 setter 内部执行此操作,或者将处理程序附加到 _userModel.PropertyChanged
并从那里调用 Add_EditUserInfo.RaiseCanExecuteChanged
。
选择处理程序选项时,请注意对象的生命周期,因为可能会导致内存泄漏。