WPF MVVM登录/退出后更改视图(iccommand执行)



最近我一直在WPF应用程序上工作,我有一些问题,使视图从LoginViewModel成功登录后改变。

BaseViewModel.cs→与MainWindow绑定

class BaseViewModel : NotificationObject
{
public DelegateCommand HomeViewCommand { get; set; }
public DelegateCommand GroupViewCommand { get; set; }
public DelegateCommand UserViewCommand { get; set; }
public DelegateCommand LoginViewCommand { get; set; }
public HomeViewModel HomeVM { get; set; }
public GroupViewModel GroupVM { get; set; }
public UserViewModel UserVM { get; set; }
public LoginViewModel LoginVM { get; set; }
private AppUser _signedUser;
public AppUser SignedUser
{
get { return _signedUser; }
set { _signedUser = value; OnPropertyChanged(); }
}
private object _currentView;
public object CurrentView
{
get { return _currentView; }
set { _currentView = value; OnPropertyChanged(); }
}
public BaseViewModel()
{
HomeVM = new HomeViewModel();
GroupVM = new GroupViewModel();
UserVM = new UserViewModel();
LoginVM = new LoginViewModel();

CurrentView = LoginVM;
GroupViewCommand = new DelegateCommand(o =>
{
CurrentView = GroupVM;
});
UserViewCommand = new DelegateCommand(o =>
{
CurrentView = UserVM;
});
HomeViewCommand = new DelegateCommand(o =>
{
CurrentView = HomeVM;
});
SignedUser = AppUser.Instance;
}
}

LoginViewModel.cs→视图中有一个绑定到SignFlow的按钮

class LoginViewModel
{
public SignInCommand SignFlow { get; }
public LoginViewModel()
{
SignFlow = new SignInCommand();
}
}

SignInCommand.cs

public class SignInCommand : CommandBase
{
public bool IsLoggedIn;
public override void Execute(object? parameter)
{
CacheCheck();
if (IsLoggedIn)
{
SignOut();
}
else
{
SignIn();
}
}
//Rest of the code for API call, token check etc.

我已经尝试实现loginsuccess事件,如这里所示,但我不能让它工作,因为在我的情况下,登录是从SignInCommand而不是LoginViewModel的一部分。

是否有一种方法可以让我在SignInCommand.cs中调用视图更改?

您可以使用对LoginViewModel或定义方法的类型的引用注入SignInCommand:

class LoginViewModel
{
public SignInCommand SignFlow { get; }
public LoginViewModel()
{
SignFlow = new SignInCommand(this);
}
public void SignIn()
{
//...
}
public void SignOut()
{
//...
}
}
public class SignInCommand : CommandBase
{
private readonly LoginViewModel _loginViewModel;
public bool IsLoggedIn;
public SignInCommand(LoginViewModel loginViewModel)
{
_loginViewModel = loginViewModel;
}
public override void Execute(object? parameter)
{
CacheCheck();
if (IsLoggedIn)
{
_loginViewModel.SignOut();
}
else
{
_loginViewModel.SignIn();
}
}
}

最新更新