потеря контекста данных главного окна - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь создать небольшое приложение, которое имеет логин и 3 страницы в качестве вкладок. Мне нужно скрыть часть главного окна перед входом в систему и показать после успешного входа.

Я загружаю дочерние представления в главном окне, используя шаблон данных.

MainWindow.xaml

    x:Class="Test.MainWindow"
    xmlns:local="clr-namespace:Test"
    xmlns:log="clr-namespace:Test.Login"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:pat="clr-namespace:Test.Participents"
    xmlns:reg="clr-namespace:Test.Register">
    <Window.Resources>
        <DataTemplate DataType="{x:Type log:LoginViewModel}">
            <log:LoginView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type reg:RegistrationViewModel}">
            <reg:RegistrationView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type fac:FacultyViewModel}">
            <fac:FacultyView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type bat:BatchViewModel}">
            <bat:BatchView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type pat:ParticipentViewModel}">
            <pat:ParticipentView />
        </DataTemplate>


    </Window.Resources>
    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid x:Name="NavBar" Visibility="{Binding IsLogin}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Button
                Grid.Column="0"
                Command="{Binding NavCommand}"
                CommandParameter="faculty"
                Content="Faculty" />
            <Button
                Grid.Column="1"
                Command="{Binding NavCommand}"
                CommandParameter="batch"
                Content="Batch" />
            <Button
                Grid.Column="2"
                Command="{Binding NavCommand}"
                CommandParameter="participant"
                Content="Participant" />
        </Grid>
        <Grid x:Name="MainContent" Row="1">
            <ContentControl Content="{Binding CurrentViewmodel}" />
        </Grid>
    </Grid>
</Window>```

MainWindowViewModel.cs

открытый класс MainWindowViewModel: BindableBase {

    private LoginViewModel _loginViewModel;

    private BatchViewModel _batchViewModel;

    private ParticipentViewModel _participentViewModel;

    private FacultyViewModel _facultyViewModel;

    public RelayCommand<string> NavCommand { get; private set; }



    private BindableBase _CurrentViewmodel;
    public BindableBase CurrentViewmodel
    {
        get { return _CurrentViewmodel; }
        set { SetProperty(ref _CurrentViewmodel,value); }
    }

    public MainWindowViewModel()
    {
        _loginViewModel = ContainerHelper.Container.Resolve<LoginViewModel>();
        _loginViewModel.NavToRegisterRequested += NavToRegister;
        _loginViewModel.NavToHomeRequested += NavToHome;




        _facultyViewModel = ContainerHelper.Container.Resolve<FacultyViewModel>();

        _batchViewModel = ContainerHelper.Container.Resolve<BatchViewModel>();
        _addbatchViewModel = 

        _participentViewModel = ContainerHelper.Container.Resolve<ParticipentViewModel>();


        NavCommand = new RelayCommand<string>(OnNav);


        _CurrentViewmodel = _loginViewModel;
        IsLogin = Visibility.Collapsed;

    }


    private Visibility _isLogin;
    public Visibility IsLogin
    {
        get { return _isLogin; }
        set { SetProperty(ref _isLogin, value); }
    }

    private void OnNav(string destination) {

        switch (destination)
        {
            case "faculty":
                CurrentViewmodel = _facultyViewModel;
                break;
            case "batch":
                CurrentViewmodel = _batchViewModel;
                break;
            case "participant":
                CurrentViewmodel = _participentViewModel;
                break;
            default:
                CurrentViewmodel = _facultyViewModel;
                break;

        }
    }


    private void NavToLogin()
    {
        CurrentViewmodel = _loginViewModel;
    }

   ---> private void NavToHome()
    {
        _isLogin = Visibility.Visible;
        //CurrentViewmodel = new MainWindowViewModel();
    }    ---> here is the doubt


    private void NavToFacultyHome()
    {
        CurrentViewmodel = _facultyViewModel;
    }
    private void NavToBatchHome()
    {
        CurrentViewmodel = _batchViewModel;
    }
    private void NavToParticepentHome()
    {
        CurrentViewmodel = _participentViewModel;
    }
}
LoginViewModel.cs

    public class LoginViewModel:BindableBase
    {
        public RelayCommand NavToRegisterCommand { get; private set; }
        public RelayCommand LoginCommand { get; private set; }

        public LoginViewModel()
        {
            NavToRegisterCommand = new RelayCommand(OnNavToRegister);
            LoginCommand = new RelayCommand(OnLogin);            
        }

        public event Action NavToRegisterRequested = delegate { };
        public event Action NavToHomeRequested = delegate { };

        private void OnNavToRegister()
        {
            NavToRegisterRequested();
        }
        private void OnLogin()
        {
            NavToHomeRequested();
        }

    }

After successful login i want show navbar grid in the main window
...