WPF MVVM ICommand不会在第一次单击时执行

时间:2014-01-08 14:37:44

标签: c# wpf wcf xaml mvvm

我们正在使用MVVM架构创建一个WPF应用程序,该架构使用WCF服务来验证用户 我们设计了一个登录屏幕,并使用ICommand属性登录按钮。

问题是3次点击后登录发生了,我无法弄清楚原因。应用程序中的所有其他按钮在第一次单击时工作正常。另一件事是如果用户名或密码输入错误,则在两次点击后抛出登录失败的方法

这是Xaml

< Button x:Name="btnLogin"
                        Width="120"
                        Height="25"
                        Margin="0,0,0,0"
                        Command="{Binding Validate}"
                        Content="Login"
                        FontSize="14"                           
                        ToolTipService.ToolTip="Login" />

这是我们绑定到命令的属性

public ICommand Validate
    {
        get { return new LoginCommands(ValidateUser); }
    }  

这是实现ICommand Interface

的类
class LoginCommands:ICommand
{
    readonly Action<object> _execute;
    readonly Predicate<object> _canExecute;


    public LoginCommands(Action<object> execute)
        : this(execute, null)
    {
    }


    public LoginCommands(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");

        _execute = execute;
        _canExecute = canExecute;
    }

    [DebuggerStepThrough]
    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameter)
    {
        _execute(parameter);
    }
}

这是ValidateUser方法

     private void ServiceValidUser()
    {
        if (SelectedLoginType.LoginTypeValue == 1)
        {
            LoginDetails.EncryptPW = LoginDetails.EncryptWindow(Password);
            _model.ValidateUser(LoginName, LoginDetails.EncryptWindow(Password),
               byte.Parse(SelectedUserType.EmpTypeValue.ToString()),
               byte.Parse(SelectedLoginType.LoginTypeValue.ToString()),
               (s, e) => ValidUser = e.Result.ValidateUserResult.ToString());
        }
        else
        {
            LoginDetails.EncryptPW = LoginDetails.Encrypt(Password);
            _model.ValidateUser(LoginName, LoginDetails.Encrypt(Password),
              byte.Parse(SelectedUserType.EmpTypeValue.ToString()),
              byte.Parse(SelectedLoginType.LoginTypeValue.ToString()),
              (s, e) => ValidUser = e.Result.ValidateUserResult.ToString());
        }
    }

    private void CheckUser()
    {
        if (ValidUser == "0" || ValidUser == "2")
        {
            _model.GetLoginDetails(LoginName, LoginDetails.EncryptPW,
                byte.Parse(SelectedUserType.EmpTypeValue.ToString()),
                byte.Parse(SelectedLoginType.LoginTypeValue.ToString()),
                (s, e) => LoginResult = e.Result.GetLoginInfoResult);
               ErrorMessage = "";
        }
        else if (ValidUser == "1")
        {
            ErrorMessage = "Opps.! Invalid Password..!";
        }
        else if(ValidUser!="3")
        {
            ErrorMessage = "User Not Found..!";

        }

        if(LoginResult!=null && ValidUser=="0")
        {
            LoginDetails.LoginInfo = LoginResult.FirstOrDefault();
            LoginDetails.UserName = LoginName;
            LoginDetails.UserType = byte.Parse(SelectedUserType.EmpTypeValue.ToString());
            LoginDetails.LoginType= byte.Parse(SelectedLoginType.LoginTypeValue.ToString());
            var window = Utilities.GetWindowRef("LoginScreen");
            window.Close();
        }
    }  

请询问您是否需要更多信息。

0 个答案:

没有答案