0

В MainViewModel есть параметр _buttonsEnabled, привязанный во view ко всем нужным кнопкам. Также есть второе окно LoginPanel, в котором происходит регистрация пользователя. Пользователя всего 2:

  1. Админ, которому доступны все кнопки
  2. user, которому некоторые кнопки недоступны

Окно LoginPanel вызываю из MainViewModel по кнопке:

[RelayCommand]
public void LoginUser()
 {
    var loginPanel = new LoginPanel();
    loginPanel.Show();
 }

У LoginPanel есть своя LogicPanelViewModel, в которой идет логика проверки логина и пороля из БД. И в зависимости от пользователя я хочу переключать _buttonsEnabled в MainViewModel.

Проблема: Как получить доступ к _buttonsEnabled из другой ViewModel? Видел решение, в котором нужно передать в конструктор класс основного окна, но это решение скорее всего реализовано без использования MVVM.

vo1sss
  • 13
  • А не должно быть два разных view для администратора и для пользователя? – XelaNimed Jul 24 '23 at 10:13
  • Видел решение, в котором нужно передать в конструктор класс - передавать окна, нельзя, это нарушение MVVM, ибо ViewModel знает про View слой, чего быть не должно. В вашем вопросе сейчас также есть это нарушение, ибо LoginPanel - это "окно", то есть View, ну а команда относится к ViewModel. Отвечая на ваш вопрос (передать VM в другую VM) - через конструктор, связывать VM слои можно, и даже порой нужно, то есть var vm = new SomeViewModel(this);, где this это MainViewModel. Но тут стоит подумать о вынесении логики за пределы VM. – EvgeniyZ Jul 24 '23 at 10:19
  • Например, вы можете использовать сообщения от MVVMToolkit, благодаря которым будете оповещать главную VM, меняя ее свойство. Или вы можете создать отдельный сервис, который будет отвечать за окна, их открывать, и уже его передавать в нужные VM. Почитайте это. Ну а так, в любом случае, вам надо абстрагироваться от View слоев, оперируя только VM. – EvgeniyZ Jul 24 '23 at 10:23
  • Пытался сделать так: var loginPanel = new LoginPanel(this); Определял конструктор LoginPanel, принимающий MainViewModel. Но вылезала ошибка, так не определялось что такое this. Нужно в Code-behind файле менять конструктор? Потому что в loginpanelviewmodel данного конструктора нет. Я оперирую только лишь двумя vm. К view я просто привязываю _buttonsEnabled. Хотелось бы обойтись малой кровью, и не использовать messenger. – vo1sss Jul 24 '23 at 11:05
  • buttonsEnabled - кнопка? Её состоянием, как правило, управляет тоже VM, а если быть точнее - команда, к которой она привязана. Как выше сказал @EvgeniyZ - выносите логику из VM в сервис/класс/etc., передавайте в VM не VM или V, а сервис, при этом он должен быть Singleton – OwDafuq Jul 24 '23 at 11:18
  • <Button isEnabled={Binding ButtonsEnabled}" Content="Отчет" > Все, что мне нужно, это при успешной авторизации в LginPanelViewModel, переключить _buttonsEnabled переменную, которая находится в MainViewModel – vo1sss Jul 24 '23 at 11:24

0 Answers0