Делаю переход с UserContol'а авторизации на UserControl главной страницы по этому примеру.
Возможно где-то что-то проглядел, но после отладки выяснилось, что на событие OnAuthorize никто не подписан и поэтому оно не отрабатывает, код ниже:
ViewModel для авторизации:
public class AuthorizationViewModel : BaseViewModel
{
//Само событие
public event EventHandler<LoginEventArgs> OnAuthorize;
...
public ICommand EnterCommand { get; }
public AuthorizationViewModel()
{
EnterCommand = new RelayCommand(Authorize);
}
private void Authorize(object o)
{
using (ChessTrainerContext ctx = new ChessTrainerContext())
{
if (ctx.Users.Where(u => u.Login == this.Login && u.Password == this.Password).Any())
//Вызов события (тут почему-то null)
OnAuthorize?.Invoke(this, new LoginEventArgs(this.Login, true));
}
}
}
public class LoginEventArgs : EventArgs
{
public string Login { get; }
public bool IsAuthorized { get; }
public LoginEventArgs(string login, bool isAuthorized)
{
Login = login;
IsAuthorized = isAuthorized;
}
}
ViewModel окна, на котором расположены UserControl'ы и в котором я подписываюсь на событие:
public class MainWindowViewModel : BaseViewModel
{
public AuthorizationViewModel authorizationViewModel { get; }
public MainWindowViewModel()
{
authorizationViewModel = new AuthorizationViewModel();
//подписываюсь на событие
authorizationViewModel.OnAuthorize += AuthorizationViewModelOnOnAuthorize;
CurrentContent = authorizationViewModel;
}
private BaseViewModel currentContent;
public BaseViewModel CurrentContent
{
get => currentContent;
set { currentContent = value; OnPropertyChanged(); }
}
private void AuthorizationViewModelOnOnAuthorize(object sender, LoginEventArgs e)
{
//проверка чтоб сменить UserControl
CurrentContent = e.IsAuthorized ? (BaseViewModel)new ChessTrainerViewModel() : authorizationViewModel;
}
}
Ну и код App.xaml.cs, в котором вызывается MainWindow при запуске:
public partial class App : Application
{
private MainWindow Window { get; set; }
public MainWindowViewModel MainViewModel { get; set; }
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
MainViewModel = new MainWindowViewModel();
Window = new MainWindow { DataContext = MainViewModel };
Window.Show();
}
}
DataContextзадается? – EvgeniyZ Apr 16 '22 at 12:12DataContext, а в примере нет, может ли быть из-за этого? – Pekor Apr 16 '22 at 13:57=new MainWindowViewModel()например, что будет означать другой объект в DataContext. Так что да, это может повлиять. Вообще у вас должен быть одинDataContextна все приложение, этого достаточно для почти всех задач. – EvgeniyZ Apr 16 '22 at 14:02