簡體   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