1

Хочу сделать свою программу многостраничной. Для этого я назначил кнопке событие по переключению страниц. Вот xaml:

   <Button Command="{Binding StartClick}"/>

вот сам StartClick:

       public ICommand StartClick
       {
           get
           {
               return new RelayCommand(() => SwitchPage(PrepareSI));
           }
       }


       public async void SwitchPage(Page page)
       {
           await Task.Factory.StartNew(() =>
           {
               CurrentPage = page;
           });
       }

Когда нажимаю на кнопку ничего не происходит. Возможно есть другой способ переключений между страницами? Этот я взял с ролика. Там, правда, кнопки находится не на странице, а я хочу переключатся внутри страницы на другую.

Попутный вопрос: в этом же ролике свойства задавались через Binding вот так:

<Frame Content="{Binding CurrentPage}"/> 

У меня же работает только так:

<Frame Content="{Binding Path=CurrentPage}"/> 

С чем это связано?

Реализация CurrentPage:


        //Возможные страницы
        public Page Main;
        public Page PrepareSI;
        public Page SI;
        public Page Settings;


        public Page CurrentPage;
        public MainViewModel()
        {
            Main = new Pages.Main();
            PrepareSI = new Pages.PrepareSI();
            SI = new  Pages.SI();
            Settings = new Pages.Settings();


            CurrentPage = Main;//ПО умолчанию начальная страница - Main
        }
  • Зачем вы каждый раз при get инициализируете команду? Бедный сборщик мусора... Зачем тут async? Также вы не показали самих свойств (CurrentPage например). Ну а вообще, я настоятельно рекомендую вам отказаться от Frame, ибо он совершенно не пригоден для привязок и имеет ряд своих заморочек. – EvgeniyZ Dec 14 '19 at 21:31
  • Я абсолютный новичок в wpf, поэтому следовал ролику. Посоветуйте альтернативу Frame. –  Dec 14 '19 at 21:32
  • Альтернатива. На другие вопросы вы ответа так и не дали. – EvgeniyZ Dec 14 '19 at 21:35
  • CurrentPage - объект класса Page. Указывает текущую страницу приложения. –  Dec 14 '19 at 21:36
  • Я знаю что это, я не вижу как вы реализовали этот "объект". Добавьте все необходимое в вопрос (кнопка править под ним). – EvgeniyZ Dec 14 '19 at 21:37
  • Это то, что Вы хотели? –  Dec 14 '19 at 21:45
  • 1
    Я вам рекомендую не брать за основу этот канал и найти более опытного "учителя", не играющего, не школьника, ибо смотря на тот код, что в видео можно сразу заявлять о том, что автор сам не знает что пишет, что советует и как он это реализует, совершая уйму ошибок. Теперь что касается самой проблемы: Запомните 2 вещи: 1. Привязка осуществляется ТОЛЬКО к публичному СВОЙСТВУ (оно имеет get и set). 2. Для оповещение интерфейса об изменении данных, свойство должно вызывать метод реализованного INotifyPropertyChanged. – EvgeniyZ Dec 14 '19 at 21:54
  • 1
    Смотрим ваш код: public Page CurrentPage; - это поле, не свойство! Оно не подходит для привязки (это ответ на ваш "попутный вопрос"). При обновление этого поля не вызывается OnPropertyChenged() (это ответ на "ничего не происходит"). – EvgeniyZ Dec 14 '19 at 21:56
  • 1
    Согласен с оратором выше. В видео по ссылке какая то ерунда. – tym32167 Dec 14 '19 at 22:04

0 Answers0