我有一个看起来像这样的DelegateCommand:
public class DelegateCommand : ICommand
{
private readonly Predicate<object> _canExecute;
private readonly Action<object> _execute;
public event EventHandler CanExecuteChanged;
public DelegateCommand(Action<object> execute)
: this(execute, null)
{
}
public DelegateCommand(Action<object> execute, Predicate<object> canExecute)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute == null || _canExecute(parameter);
}
public void Execute(object parameter)
{
_execute(parameter);
}
public void RaiseCanExecuteChanged()
{
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
}我有一个进程,允许用户注册到一个数据库。但是,我需要添加一些验证,例如,用户名是否已经存在,密码是否匹配规则等。以下是register命令:
#region RegisterCommand
private DelegateCommand _registerCommand;
public ICommand RegisterCommand
{
get
{
_registerCommand = new DelegateCommand(param => Register());
return _registerCommand;
}
}
private bool CanRegister()
{
return true;
}
private void Register()
{
var newUser = new User
{
FirstName = _firstname,
LastName = _lastname,
Username = _username,
Password = "", // TODO: Hashing and storing of passwords
};
using (var context = new WorkstreamContext())
{
var users = context.Set<User>();
users.Add(newUser);
context.SaveChanges();
}
}
#endregion如您所见,我有一个名为CanRegister()的方法,我想使用它来过滤注册过程。我的问题是,我如何在这里的调用中实现CanRegister():
_registerCommand = new DelegateCommand(param => Register());
如果CanRegister返回false,它会提示或拒绝该进程吗?
发布于 2017-07-12 17:51:59
通常的方法是禁用命令按钮,直到满足所有验证条件。在您的示例中,如果您有两个验证规则(用户名不存在,密码匹配规则),我将执行以下操作:
延迟绑定:
<TextBox Text="{Binding UserName, Delay=500, UpdateSourceTrigger=PropertyChanged}" />视图模型
#region RegisterCommand
private DelegateCommand _registerCommand;
public ICommand RegisterCommand
{
get
{
_registerCommand = new DelegateCommand(param => Register(), () => CanRegister());
return _registerCommand;
}
}
private bool CanRegister()
{
return _isUserNameUnique && _isStrongPassword;
}
public string UserName
{
get {return _userName;}
set
{
_userName = value;
OnUserNameChanged();
}
}
public string Password
{
get {return _password;}
set {_password = value; OnPasswordChanged();
}
private void OnUserNameChanged()
{
_isUserNameUnique = VerifyUserNameIsUnique(_userName);
_registerCommand.RaiseCanExecuteChanged();
}
private void OnPasswordChanged()
{
_isStrongPassword = VerifyIsStrongPassword();
_registerCommand.RaiseCanExecuteChanged();
}
private void Register()
{
var newUser = new User
{
FirstName = _firstname,
LastName = _lastname,
Username = _username,
Password = "", // TODO: Hashing and storing of passwords
};
using (var context = new WorkstreamContext())
{
var users = context.Set<User>();
users.Add(newUser);
context.SaveChanges();
}
}
#endregionhttps://stackoverflow.com/questions/45044205
复制相似问题