0

Пытался сделать панель авторизации. В главном окне есть панель, в этой панели есть Frame, с его помощью буду менять Page. Пытался сделать ViewModel и поставить его DataContext к окну, сам переход планировал сделать через Frame, но столкнулся с проблемой. У меня есть 2 Page: LoginPage и RegistrationPage. У них по идее должены быть свои ViewModel'и. В главной ViewModel'и есть свойство CurrentPage. Как это свойство передать в другие ViewModel'и? И если это возможно, то как я могу ко всем Page'ам и главному окну присобачить один и тот же DataContext? Когда я прописываю всем один и от же DataContext, то вылезает StackOverFlow Exception.

ViewModel

 {
        public AuthViewModel()
                 {
             }
            public event PropertyChangedEventHandler PropertyChanged;
            public void OnPropertyChanged([CallerMemberName] string prop = "")
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(prop));
            }

            private Page _currentpage;

            public Page CurrentPage
            {
                get { return _currentpage; }
                set
                {
                    _currentpage = value;
                    OnPropertyChanged("CurrentPage");
                }
            }


            private RelayCommand addCommand;
            public RelayCommand Registration
            {
                get
                {
                    return addCommand ??
                        (addCommand = new RelayCommand(obj =>
                        {
                            CurrentPage = new RegistrationPage();
                        }));
                }
            }

            private RelayCommand addCommand2;
            public RelayCommand LogIn
            {
                get
                {
                    return addCommand2 ??
                        (addCommand2 = new RelayCommand(obj =>
                        {
                            CurrentPage = new LoginPage();
                        }));
                }
            }
        }
}

MainView

<Window x:Class="Progect1.MainWindow"
        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:local="clr-namespace:Progect1"
        xmlns:avm="clr-namespace:Progect1.ViewModels"
        xmlns:tb="http://www.hardcodet.net/taskbar"    
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        mc:Ignorable="d"
        Title="MainWindow" Height="480" Width="506.522"
        WindowStartupLocation="CenterScreen" ResizeMode="CanMinimize" WindowStyle="None">
&lt;Window.DataContext&gt;
    &lt;avm:AuthViewModel/&gt;
&lt;/Window.DataContext&gt;

&lt;Window.Resources&gt;
    &lt;ContextMenu x:Key=&quot;Menu&quot; Background=&quot;White&quot;&gt;
        &lt;MenuItem Header=&quot;Показать/Скрыть&quot; Click=&quot;AppShow&quot;/&gt;
        &lt;MenuItem Header=&quot;Выйти&quot; Click=&quot;AppExit&quot; /&gt;
    &lt;/ContextMenu&gt;
&lt;/Window.Resources&gt;

&lt;Grid Background=&quot;#FF36393F&quot;&gt;
    &lt;Grid x:Name=&quot;AuthGrid&quot; &gt;
        &lt;Frame Content=&quot;{Binding CurrentPage}&quot; NavigationUIVisibility=&quot;Hidden&quot;&gt;

        &lt;/Frame&gt;
    &lt;/Grid&gt;
    &lt;local:NaviBar HorizontalAlignment=&quot;Left&quot; Height=&quot;20.667&quot; Margin=&quot;416.534,0,-0.532,0&quot; VerticalAlignment=&quot;Top&quot; Width=&quot;90.52&quot;/&gt;
    &lt;local:PanelMove HorizontalAlignment=&quot;Left&quot; Height=&quot;20&quot; VerticalAlignment=&quot;Top&quot; Width=&quot;416.534&quot;/&gt;
&lt;/Grid&gt;

</Window>

View LoginPage

<Page x:Class="Progect1.Views.Auth.LoginPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Progect1.Views.Auth" 
      xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
      xmlns:lt="clr-namespace:Progect1"
       xmlns:dc="clr-namespace:Progect1.ViewModels"
      mc:Ignorable="d" 
      Title="LoginPage">
&lt;Grid&gt;
    &lt;Border CornerRadius=&quot;12&quot; Padding=&quot;2&quot; BorderThickness=&quot;1&quot; Background=&quot;#FF202225&quot; Margin=&quot;117,0,117.522,62.283&quot; Height=&quot;292&quot; VerticalAlignment=&quot;Bottom&quot; Grid.ColumnSpan=&quot;2&quot;&gt;
        &lt;Grid &gt;
            &lt;TextBlock HorizontalAlignment=&quot;Left&quot; Height=&quot;23.333&quot; TextWrapping=&quot;Wrap&quot; Text=&quot;Логин&quot; VerticalAlignment=&quot;Top&quot; Width=&quot;266&quot; FontFamily=&quot;Segoe UI Symbol&quot; FontWeight=&quot;Bold&quot; TextAlignment=&quot;Center&quot; FontSize=&quot;20&quot; Foreground=&quot;#FFB9B9B9&quot; Margin=&quot;0,17.003,0,0&quot;/&gt;
            &lt;TextBlock HorizontalAlignment=&quot;Left&quot; Height=&quot;27.333&quot; Margin=&quot;0,87.819,0,0&quot; TextWrapping=&quot;Wrap&quot; Text=&quot;Пароль&quot; VerticalAlignment=&quot;Top&quot; Width=&quot;266&quot; FontFamily=&quot;Segoe UI Symbol&quot; FontWeight=&quot;Bold&quot; TextAlignment=&quot;Center&quot; FontSize=&quot;20&quot; Foreground=&quot;#FFB9B9B9&quot;/&gt;
            &lt;lt:LoginButton Height=&quot;48&quot; Margin=&quot;53,195.664,52,0&quot; Width=&quot;Auto&quot; VerticalAlignment=&quot;Top&quot;/&gt;
            &lt;lt:TextBoxCustom2 Height=&quot;26.5&quot; Margin=&quot;18.148,45,17,0&quot; VerticalAlignment=&quot;Top&quot;&gt;
            &lt;/lt:TextBoxCustom2&gt;
            &lt;lt:TextBoxCustom2  Height=&quot;26.5&quot; Margin=&quot;18.148,118.343,17,0&quot; VerticalAlignment=&quot;Top&quot;/&gt;
            &lt;lt:LinkLabel Text=&quot;Зарегистрироваться&quot; HorizontalAlignment=&quot;Left&quot; Height=&quot;17.821&quot; Margin=&quot;115.146,248.664,0,0&quot; VerticalAlignment=&quot;Top&quot; Width=&quot;115&quot;&gt;
                &lt;i:Interaction.Triggers&gt;
                    &lt;i:EventTrigger EventName=&quot;Click&quot;&gt;
                        &lt;i:InvokeCommandAction Command=&quot;{Binding Registration}&quot;/&gt;
                    &lt;/i:EventTrigger&gt;
                &lt;/i:Interaction.Triggers&gt;
            &lt;/lt:LinkLabel&gt;
        &lt;/Grid&gt;
    &lt;/Border&gt;
&lt;/Grid&gt;

</Page>

VeNNoM
  • 115
  • EvgeniyZ, я там не совсем понял, мне бы просто хотя бы понять как передавать одну переменную CurrentPage между двумя ViewModel. – VeNNoM Jul 21 '20 at 10:19
  • Вы хоть пробовали или просто так открыли и "Не понятно!, Сложно!"? Там ведь максимально простые и базовые вещи, которые я расписал как можно подробней, даже написал почему не стоит использовать Frame. Вы попробуйте, я уверен, что у вас получится! По поводу "Как передать?", ну, наверно через конструктор? – EvgeniyZ Jul 21 '20 at 10:47
  • EvgeniyZ, С точки зрения MVVM такая навигация правильная https://www.youtube.com/watch?v=1_cUgpWqS0Y ? – VeNNoM Jul 21 '20 at 14:13
  • Да, и об этом написано в ответе, который я указал как дубликат. Зачем искали, чего искали.. не понятно мне... – EvgeniyZ Jul 21 '20 at 14:19
  • Смог повторить то, что на видео) В вашей ответе все подробно расписано, но мне было очень сложно повторить, а по видео получилось. – VeNNoM Jul 21 '20 at 14:23
  • Потому что вы бездумно копировали то, что пишет человек на видео, не осознавая что и как делает. Это легче, да, только в голове у вас вряд-ли что отложилось и если не будет видео, вы вряд-ли это сделаете сами. – EvgeniyZ Jul 21 '20 at 14:25
  • Ну то, что я не совсем до конца понял как это работает - верно. Просто так я смог хотя бы повторить. Конструкцию хоть запомнил, пока что для меня она как шаблон. Я вот тут переключаю вьюшки очень быстро и за секунд 30 таких кликов набегает +- 1-2 мб оперативы, это нормально? – VeNNoM Jul 21 '20 at 15:06
  • Ну а сами подумать? Вы постоянно делаете (скорей всего) new нужнаяVM();, чего же еще вы ожидали? – EvgeniyZ Jul 21 '20 at 15:09
  • Не, если так делать, то при переключении за 30 секунд и 4-6 мб набежать может. А так я объявил их как переменные, но все равно чутка оперативы прибавляется. – VeNNoM Jul 21 '20 at 15:11
  • Я не знаю вашего кода, как вы предлагаете мне вам помогать? Ну а так, 4-6 мб в наше время это ничтожные цифры. – EvgeniyZ Jul 21 '20 at 15:13
  • Также почему-то не сохраняются данные,например введенный текст в textbox. При переключении текстбокс обнуляется, хотя я как переменные их ввел. – VeNNoM Jul 21 '20 at 15:14
  • Повторюсь, я не вижу вашего кода!, создавайте новый вопрос с конкретной проблемой, не надо тут задавать то, что уже не относится к первоначальному вопросу. Предлагаю вам проголосовать за дубликат и закрыть этот вопрос раз и на всегда, после, попробовать разобраться самим и в случае неудачи сделать новый, вопрос с необходимыми данными. – EvgeniyZ Jul 21 '20 at 15:17

0 Answers0