0

Нужно реализовать изменение отображаемого контента в окне. Все переходы происходят по нажатию кнопок в разных контролах. MainWindow открывается после успешной регистрации.

Схема переходов Схема переходов

Пытался сделать по этим примерам(пример1, пример2), они похожи, но мне нужно что бы была возможность изменять содержимое из каждого контрола, получилось сделать только переходы между "AuthorizationControl" и "RegistrationFirstStageControl". Вот код который у меня есть на данный момент:

Основная ViewModel

namespace Frontend.ViewModel.AuthorizationRegistrationWindow
{
    public class RootViewModel : ObservableObjcet
    {
        private object _currentContentVM;
        public object CurrentContentVM
        {
            get => _currentContentVM;
            set
            {
                _currentContentVM = value;
                OnPropertyChanged("CurrentContentVM");
            }
        }
    public RootViewModel()
    {
        //Здесь я передаю Action, что бы изменить содержимое из другого контрола.
        CurrentContentVM = new AuthorizationViewModel((param) => CurrentContentVM = param);
    }
}

}

ViewModel авторизации

namespace Frontend.ViewModel.AuthorizationRegistrationWindow
{
    public class AuthorizationViewModel : ObservableObjcet
    {
        private AuthorizationModel _authorizationModel;
        public AuthorizationViewModel(Action<object> onActivate)
        {
            //Здесь в команду помещаю тот самый отправленный Action, который вызывается по нажатию 
            //кнопки и открывается контрол регистрации.
            OpenFirstStageReg = new DelegateCommand((o) => onActivate(new FirstStageRegViewModel()));
        _authorizationModel = new AuthorizationModel();
    }

    #region Property
    private string _login;
    public string Login
    {
        get { return _login; }
        set 
        { 
            _login = value;
            OnPropertyChanged();
        }
    }

    private string _password;
    public string Password
    {
        get { return _password; }
        set
        {
            _password = value;
            OnPropertyChanged();
        }
    }

    private bool _isAuth;
    public bool IsAuth
    {
        get { return _authorizationModel.IsAuth; }
        set 
        {
            _isAuth = value;
            OnPropertyChanged();
        }
    }
    #endregion

    /*COMMAND*/
    public DelegateCommand OpenFirstStageReg { get; private set; }
}

}

Код окна авторизации и регистрации

<Window x:Class="Frontend.View.AllWindows.AuthorizationRegistrationWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:view="clr-namespace:Frontend.View.Controls.AuthorizationRegistration"
        xmlns:vm="clr-namespace:Frontend.ViewModel.AuthorizationRegistrationWindow"
        mc:Ignorable="d"
        Title="xProject" Height="450" Width="800" MinHeight="400" MinWidth="400">
&lt;Window.Resources&gt;
    &lt;DataTemplate DataType=&quot;{x:Type vm:AuthorizationViewModel}&quot;&gt;
        &lt;view:AuthorizationControl/&gt;
    &lt;/DataTemplate&gt;
    &lt;DataTemplate DataType=&quot;{x:Type vm:FirstStageRegViewModel}&quot;&gt;
        &lt;view:RegistrationFirstStageControl/&gt;
    &lt;/DataTemplate&gt;
    &lt;DataTemplate DataType=&quot;{x:Type vm:SecondStageRegViewModel}&quot;&gt;
        &lt;view:RegistrationSecondStageControl/&gt;
    &lt;/DataTemplate&gt;
&lt;/Window.Resources&gt;
&lt;ContentPresenter Content=&quot;{Binding CurrentContentVM}&quot;/&gt;

</Window>

Файл App.xaml.сs

namespace Frontend
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
        var mainWindow = new AuthorizationRegistrationWindow();
        mainWindow.DataContext = new RootViewModel();
        mainWindow.Show();
    }
}

}

Denis
  • 43
  • 6
  • 1
    Можете внедрить какой-нибудь сервис, добавить его в DI контейнер и уже его изменять в ваших ViewModel's. В нужной VM(где нужно показывать изменения) подпишитесь на событие об изменение свойств.

    Если не хотите использовать DI-контейнер, то простой и топорный вариант - Singleton/Static класс. В нем также реализовываете нужные вам свойства и события об их изменении, но смотреться все это будет гораздо хуже.

    Я лично открыл для себя новый мир в WPF, когда познакомился с Prism, ReactiveUI фреймворками. Оба вам рекомендую.

    – Lapish Oct 03 '21 at 12:06
  • Вместо того чтобы разобраться в вопросе используя прилинкованный ответ, вы создаете дубликат вопроса только изменив заголовок. Не надо так. – aepot Oct 03 '21 at 12:12
  • Передаете главную вьюмодель в конструктор вм логина, по кнопке в команде меняете вм на основную в главной вм, получаете ожидаемый результат. Но не разобравшись, как это работает, ничего не получится. – aepot Oct 03 '21 at 12:18
  • @aepot, я пытался разобраться в вопросе используя прилинкованный ответ, но видимо мой опыт не позволяет мне адаптировать прилинкованный ответ к своей ситуации. Поэтому я и пытаюсь задать вопрос. – Denis Oct 03 '21 at 12:19
  • Вы сначала запустите пример отдельно и разберитесь в том как он сам по себе работает, а уже потом внедряйте. Сходу конечно сложно может показаться. – aepot Oct 03 '21 at 12:22
  • Dependency Injection/Inversion of Control контейнер необязательно сразу прикручивать, можно по-старинке. В прилинкованном ответе и так и сяк показано. – aepot Oct 03 '21 at 12:24
  • Добавил еще ссылку - как делать команды. – aepot Oct 03 '21 at 12:36
  • @aepot, если я правильно вас понял, нужно передавать основнуюVM(RootViewModel) в конструктор VM которую нужно открыть(AuthorizationViewModel), и далее из этой VM открывать другие VM используя VM которую передали. – Denis Oct 03 '21 at 12:38
  • Да, можно так.. – aepot Oct 03 '21 at 12:52

0 Answers0