Пытался сделать панель авторизации. В главном окне есть панель, в этой панели есть 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">
<Window.DataContext>
<avm:AuthViewModel/>
</Window.DataContext>
<Window.Resources>
<ContextMenu x:Key="Menu" Background="White">
<MenuItem Header="Показать/Скрыть" Click="AppShow"/>
<MenuItem Header="Выйти" Click="AppExit" />
</ContextMenu>
</Window.Resources>
<Grid Background="#FF36393F">
<Grid x:Name="AuthGrid" >
<Frame Content="{Binding CurrentPage}" NavigationUIVisibility="Hidden">
</Frame>
</Grid>
<local:NaviBar HorizontalAlignment="Left" Height="20.667" Margin="416.534,0,-0.532,0" VerticalAlignment="Top" Width="90.52"/>
<local:PanelMove HorizontalAlignment="Left" Height="20" VerticalAlignment="Top" Width="416.534"/>
</Grid>
</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">
<Grid>
<Border CornerRadius="12" Padding="2" BorderThickness="1" Background="#FF202225" Margin="117,0,117.522,62.283" Height="292" VerticalAlignment="Bottom" Grid.ColumnSpan="2">
<Grid >
<TextBlock HorizontalAlignment="Left" Height="23.333" TextWrapping="Wrap" Text="Логин" VerticalAlignment="Top" Width="266" FontFamily="Segoe UI Symbol" FontWeight="Bold" TextAlignment="Center" FontSize="20" Foreground="#FFB9B9B9" Margin="0,17.003,0,0"/>
<TextBlock HorizontalAlignment="Left" Height="27.333" Margin="0,87.819,0,0" TextWrapping="Wrap" Text="Пароль" VerticalAlignment="Top" Width="266" FontFamily="Segoe UI Symbol" FontWeight="Bold" TextAlignment="Center" FontSize="20" Foreground="#FFB9B9B9"/>
<lt:LoginButton Height="48" Margin="53,195.664,52,0" Width="Auto" VerticalAlignment="Top"/>
<lt:TextBoxCustom2 Height="26.5" Margin="18.148,45,17,0" VerticalAlignment="Top">
</lt:TextBoxCustom2>
<lt:TextBoxCustom2 Height="26.5" Margin="18.148,118.343,17,0" VerticalAlignment="Top"/>
<lt:LinkLabel Text="Зарегистрироваться" HorizontalAlignment="Left" Height="17.821" Margin="115.146,248.664,0,0" VerticalAlignment="Top" Width="115">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding Registration}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</lt:LinkLabel>
</Grid>
</Border>
</Grid>
</Page>
Frame. Вы попробуйте, я уверен, что у вас получится! По поводу "Как передать?", ну, наверно через конструктор? – EvgeniyZ Jul 21 '20 at 10:47new нужнаяVM();, чего же еще вы ожидали? – EvgeniyZ Jul 21 '20 at 15:09