首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将验证传递到DelegateCommand

将验证传递到DelegateCommand
EN

Stack Overflow用户
提问于 2017-07-12 04:47:22
回答 1查看 156关注 0票数 0

我有一个看起来像这样的DelegateCommand

代码语言:javascript
复制
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命令:

代码语言:javascript
复制
#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,它会提示或拒绝该进程吗?

EN

回答 1

Stack Overflow用户

发布于 2017-07-12 17:51:59

通常的方法是禁用命令按钮,直到满足所有验证条件。在您的示例中,如果您有两个验证规则(用户名不存在,密码匹配规则),我将执行以下操作:

  1. 在用户键入用户名时检查用户名是否存在。显然,您不希望每次击键后都触发数据库调用,因此请在绑定中使用Delay选项。在ViewModel中设置一个属性以反映结果,例如IsUserNameUnique。设置此属性时,请在此过程中调用密码的RaiseCanExecuteChanged方法,并在其构造函数中将DelegateCommand IsStrongPassword.
  2. Hook到CanRegister方法中。这将禁用该命令,直到CanRegister返回true。
  3. 将CanRegister命令更改为仅在IsStrongPassword和IsUserNameUnique均为true时返回true。

延迟绑定:

代码语言:javascript
复制
<TextBox Text="{Binding UserName, Delay=500, UpdateSourceTrigger=PropertyChanged}" />

视图模型

代码语言:javascript
复制
#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();
    }
}

#endregion
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45044205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档