繁体   English   中英

如何在 C# 中使用 MVVM、WPF 在登录为 false 时禁用按钮

[英]How to disable button when the login is false using MVVM,WPF in C#

我正在研究 mvvm 模式并遇到了一个问题,我需要确保当用户错误地输入他的数据时按钮处于非活动状态

我有对话窗口(登录页),我在其中投票登录名和密码

public class LoginViewModel : ViewModel
{
    ApplicationDbContext db;
    IEnumerable<User> users;
    IAuthorizationService _authorizationService;
    IHashingManager _hashingManager;

    private bool? _closeWindow;
    private RelayCommand _loginUser;
    private RelayCommand _cancelCommand;
    public bool EnableClose { get; set; }

    public LoginViewModel(IViewFactory viewFactory, ICore core) : base(viewFactory)
    {
        _authorizationService = core.AuthorizationService;
        _hashingManager = core.HashingManager;
        db = new ApplicationDbContext();
    }

    public ICommand Command { get; set; }


    private string login;
    public string Login
    {
        get => login;
        set
        {
            login = value;
            RaisePropertyChanged(nameof(Login));
        }
    }
    private string password;
    public string Password
    {
        get => password;
        set
        {
            password = value;
            RaisePropertyChanged(nameof(Password));
        }
    }
    public RelayCommand CancelCommand
    {
        get
        {
            return _cancelCommand ??
        (_cancelCommand = new RelayCommand(() =>
            {
                 var result = _authorizationService.Login(Login, _hashingManager.Encrypt(Password));
                 CloseWindow = true;
            }));
        }
    }

    public bool? CloseWindow
    {
        get { return _closeWindow; }
        set
        {
            _closeWindow = value;
            RaisePropertyChanged(nameof(CloseWindow));
        }
    }

    public RelayCommand LoginUser
    {
        get
        {
            return _loginUser ??
                (_loginUser = new RelayCommand(() =>
                {
                    var result = _authorizationService.Login(Login, _hashingManager.Encrypt(Password));
                    CloseWindow = true;
                }));

        }
    }


    public IEnumerable<User> Users
    {
        get { return users; }
        set
        {
            users = value;
            RaisePropertyChanged("Users");
        }
    }
}

我的主窗口虚拟机

public class MainViewModel : ViewModel
{
    private readonly ICore _core;
    public ICommand LoginCommand { get; }

    public ObservableCollection<ILayoutElementViewModel> Documents { get; private set; }
    public MainViewModel(IViewFactory viewFactory, ICore core) : base(viewFactory)
    {
        _core = core;
        this.Documents = new ObservableCollection<ILayoutElementViewModel>();
    }


    ServiceResult _serviceResult = new ServiceResult();
    

    private RelayCommand openChartView;
    public RelayCommand OpenChartView
    {
        get
        {
            return openChartView ??
                (openChartView = new RelayCommand(()=>
                {
                    if (_serviceResult.IsSucceed)
                    {
                        var chartView = new ChartSelectionViewModel(_viewFactory);
                        _viewFactory.ShowDialogView(chartView);
                    }
                }));
        }
    }


    private string _myProperty;
    public string MyProperty
    { 
        get => _myProperty;
        set
        {
            _myProperty = value;
            RaisePropertyChanged(() => MyProperty);
        }
    }

    protected override void LoadedExecute()
    {
        base.LoadedExecute();
        _viewFactory.ShowDialogView(new LoginViewModel(_viewFactory, _core));

    }
}

当我写得正确与否时,我的对话窗口关闭,主窗口变为活动状态。 有一个按钮,当登录名和密码不正确时,我想禁用此按钮。

我想我必须在 MW 中使用我的 ServiceResult

    public class ServiceResult
{
    public bool IsSucceed { get; set; }
    public string Error { get; set; }
    public ServiceResult()
    {
        IsSucceed = true;
    }

    public ServiceResult(string error)
    {
        IsSucceed = false;
        Error = error;
    }
}

或者

授权服务

public class AuthorizationService : IAuthorizationService
{
    public ServiceResult Login(string login,string password)
    {
        ApplicationDbContext db = new ApplicationDbContext();

        var listUsers = db.Users.ToList();
        foreach (var item in listUsers)
        {
            if (item.Login == login && item.Password == password)
            {
                return new ServiceResult();
            }
        }
        return new ServiceResult("Wrong Login or Password!");
      }
}

我怎样才能做到这一点? 谢谢你。

我做到了,太容易了

protected override void LoadedExecute()
    {
        base.LoadedExecute();
        var vm = new LoginViewModel(_viewFactory, _core);
        _viewFactory.ShowDialogView(vm);
        IsAuth = vm.AuthorizationResult;
    }


private RelayCommand openChartView;
    public RelayCommand OpenChartView
    {
        get
        {
            return openChartView ??
                (openChartView = new RelayCommand(()=>
                {
                    if (IsAuth)
                    {
                        var chartView = new ChartSelectionViewModel(_viewFactory);
                        _viewFactory.ShowDialogView(chartView);
                    }
                }));
        }
    }

您可以对按钮的 IsEnable 属性执行 bool 绑定。

代码:

public bool Enabled
  {
      get => _enabled; set
      {
          _enabled = value;
          NotifypropertyChanged("Enabled");
       }
  }

xml:

<Button IsEnabled="{Binding Enabled}"></Button>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM