0

Создаю приложение, и не могу понять вроде делал по инструкции с гайда в интернете, но переключение страниц не работает, при нажатии кнопки, подскажите пожалуйста: Сама функция переключения:

using GalaSoft.MvvmLight.Command;
using PCheck.View;
using System.Windows.Controls;
using System.Windows.Input;

namespace PCheck { internal class ViewMainModal : ViewModelChangings { private Page _startPage = new StartPage(); private Page _diagnosticPage = new DiagnosticPage(); private Page _mainPage = new MainPage();

    public Page _CurPage
    {
        get => null;
        set => Set(ref _startPage, value);
    }

    public ICommand OpenStartPage
    {
        get
        {
            return new RelayCommand(() => _CurPage = _startPage);
        }
    }
    public ICommand OpenDiagnosticPage
    {
        get
        {
            return new RelayCommand(() => _CurPage = _diagnosticPage);
        }
    }
    public ICommand OpenMainPage
    {
        get
        {
            return new RelayCommand(() => _CurPage = _mainPage);
        }
    }
}

}

И так же Xaml где находится следующие основные элементы, это кнопка по которой идёт переключение,frame в котором будет появляться окно и объявление где хранится и какая функция используется

<Window.DataContext>
    <local:ViewMainModal d:IsDataSource="True"/>
</Window.DataContext>
    xmlns:dc="clr-namespace:PCheck.View"
    xmlns:local="clr-namespace:PCheck"
    <Button HorizontalAlignment="Left" Command="{Binding OpenStartPage}" BorderThickness="0" Margin="774,457,0,0" VerticalAlignment="Top" BorderBrush="Transparent" Height="52" Width="208" FontFamily="Rostelecom Basis" FontWeight="Bold" FontSize="17" Background="#FFFD4E1F" Foreground="{x:Null}" Cursor="Hand" Click="Button_Click_4">
    <Frame x:Name="MainFraime" NavigationUIVisibility="Hidden" Content="{Binding _CurPage}" Navigated="MainFraime_Navigated"/>
  • https://ru.stackoverflow.com/a/1266479/373567 – aepot Mar 21 '24 at 13:27
  • Если прямо про этот код, вы не можете созданные страницы хранить, вы можете их только создавать, потому что использованная страница, с которой вы уходите, уничтожается. Правильно вот так new RelayCommand(() => _CurPage = new MainPage()); Но это не решение, если вы собираетесь или используете MVVM, так как оно нарушает MVVM. Решение в предыдущем комментарии, по ссылке. – aepot Mar 21 '24 at 13:29
  • Советую почитать это и это – EvgeniyZ Mar 21 '24 at 13:40
  • aepot, Получается изменил на ваш код , всё-равно ничего не происходит – Канал OverKilla Mar 21 '24 at 14:12
  • А суть сохранения нужна была для сохранения данных которые вводит пользователь и не стирать их, так же появляются элементы , которые как бы уникальные и должны оставаться – Канал OverKilla Mar 21 '24 at 14:13
  • Ваши данные должны быть в VM/Model слое, но не в View слое, ну а Page является View слоем. Другими словами, у вас у каждой страницы должна быть своя VM, которая не должна находиться в XAML, а создаваться также, отдельно, и вот уже она должна храниться. Если бы у вас использовались DI контейнеры (советую кстати), то ваша задача решилась бы просто - зарегистрировать VM как синглтон, который раз создается и больше не удаляется. Ну а так, как я вам уже ссылками выше намекнул, убирайте из XAML DataContext и храните их отдельно. – EvgeniyZ Mar 21 '24 at 16:43
  • 1
    @EvgeniyZ мы с вами посмотрели, а get => null никто не заметил. :) – aepot Mar 26 '24 at 17:02

1 Answers1

1

Только сейчас заметил get => null;. Что должно происходить, если вы что бы не происходило, отдаете null?

internal class ViewMainModal : ViewModelChangings
{
    private page _curPage = new MainPage();
public Page CurPage
{
    get =&gt; _curPage;
    set =&gt; Set(ref _curPage, value);
}

public ICommand OpenStartPage { get; } = new RelayCommand(() =&gt; CurPage = new StartPage());
public ICommand OpenDiagnosticPage { get; } = new RelayCommand(() =&gt; CurPage = new DiagnosticPage());
public ICommand OpenMainPage { get; } = new RelayCommand(() =&gt; CurPage = new MainPage());

}

Но вообще Frame+Page не подходят для нормального использования в MVVM, поэтому я бы рекомендовал другое решение.

Я переименовал свойство, чтобы избежать путаницы, не забудьте Content="{Binding CurPage}" поправить в XAML.

aepot
  • 49,560