Отображение разного содержимого в одном окне WPF + MVVM

147
30 декабря 2021, 02:00

Добрый вечер. Собственно, вопрос заключается в том , как в одном окне отображать разное содержимое К примеру то же приложение киви десктопное. Вводишь пин и там уже совершенно другое отрисовывается

Вообще узнаю для того , чтобы понять: как сделать так , чтоб при запуске десктоп приложения проверялось авторизован ли пользователь, если нет - то будет отображена форма авторизации, иначе будет отображено основной интерфейс программы. Я профан в это деле и только начал познавать Wpf + mvvm. И желательно как можно подробнее описать всё это дело
Не кидайтесь тапками, пожалуйста :)

Приложение Киви:

Answer 1

Очень просто. Возьмите ContentPresenter или ContentControl.

Положите контент окна, каким он должен быть в начале, в первый UserControl (пусть будет AuthorizationPresentation), а контент, который должен появиться потом — во второй UserControl (MainPresentation).

Заведите себе два VM-класса: AuthorizationVM (для авторизации) и MainVM (для основного контента), а также RootVM:

class RootVM : INotifyPropertyChanged
{
    object currentContentVM;
    public object CurrentContentVM
    {
        get => currentContentVM;
        set => /* тут имплементация INotifyPropertyChanged */
    }
}

Ваш XAML будет выглядеть так:

<Window ...>
    <Window.Resources>
        <DataTemplate DataType="{x:Type vm:AuthorizationVM}">
            <view:AuthorizationPresentation/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type vm:MainVM}">
            <view:MainPresentation/>
        </DataTemplate>
    </Window.Resources>
    <ContentPresenter Content="{Binding CurrentContentVM}"/>
</Window>

Установите DataContext'ом окна экземпляр RootVM.

Теперь вы можете регулировать, какой контент показывается в окне, устанавливая в RootVM свойство CurrentContentVM. Если записать туда экземпляр AuthorizationVM, будет показан AuthorizationPresentation, а если MainVM — то MainPresentation.

Всё!

Небольшое дополнение: а как связать между собой VM? Для этого разные VM должны создаваться не в XAML-коде своего View, а отдельно, в начале программы, которая занимается настройкой всего. Для этого имеет смысл установить точку входа в OnStartup. Примеры того, как переключать VM, тут и тут. Логику приложения, по идее, имеет смысл вынести из OnStartup в корневую VM.

READ ALSO
ООП структура C#

ООП структура C#

//Есть структура Diary,для примера есть один метод ShowData,который выводит данные,но как быть если структур несколько,как мне обращаться к другим...

113
C# Interactive не поддерживает классы System.Index и System.Range из NET Core 3.0

C# Interactive не поддерживает классы System.Index и System.Range из NET Core 3.0

Не так давно обновил Visual Studio и поставилNET Core 3

185
частота анализа текста C# WinForms

частота анализа текста C# WinForms

Не понимаю, как сделать, что бы подсчитывало не только русские букву но и английские буквы

156
Unity3d Android вращение одного объект вокруг другого с помощью джойстика

Unity3d Android вращение одного объект вокруг другого с помощью джойстика

хочу сделать игру на unity android, есть сфера вокруг которой должен крутиться объект firePoint c помощью джойстика, но объект который крутится вокруг...

178