0

Делаю переход с 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 =&gt; u.Login == this.Login &amp;&amp; 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 =&gt; 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();
    }
}

Pekor
  • 449
  • Конструктор MainWindowViewModel вызывается хотяб? Где у вас DataContext задается? – EvgeniyZ Apr 16 '22 at 12:12
  • @EvgeniyZ, ага, в App.xaml.cs, добавил в текст вопроса код – Pekor Apr 16 '22 at 12:20
  • Чет я не думаю, что проблема в этом коде. Такое впечатление, будто вы повторно где-то инициализируете VM классы (может в XAML, может еще где), из-за чего и подписка сбрасывается. Попробуйте проследишь шаг за шагом что делает ваш код. – EvgeniyZ Apr 16 '22 at 13:03
  • У меня в XAML UserControl'ов есть DataContext, а в примере нет, может ли быть из-за этого? – Pekor Apr 16 '22 at 13:57
  • 1
    Ну это равноценно повторному =new MainWindowViewModel() например, что будет означать другой объект в DataContext. Так что да, это может повлиять. Вообще у вас должен быть один DataContext на все приложение, этого достаточно для почти всех задач. – EvgeniyZ Apr 16 '22 at 14:02
  • @EvgeniyZ, ух ты, это открытие для меня, спасибо, ошибка была действительно в DataContext в xaml, но я почему-то думал что без указания не будут работать binding'и) – Pekor Apr 16 '22 at 16:44

0 Answers0