dolfijn3000 Ответов: 1

Привязка Wpf не обновляется с помощью inotifypropertychanged


Всем привет,
Я новичок в WPF и MVVM (я использую mvvm light) и пытаюсь создать приложение, которое имеет 2 страницы. На странице 1 находится кнопка, которая должна переключить текущую страницу на вторую страницу.
Когда я запускаю свое приложение и нажимаю кнопку, ничего не происходит. Нет ошибки, нет выхода. Поэтому я начал отладку, и все работает, выполняется событие изменения свойства и передаются правильные данные.

КОД:
Это модель представления для моего главного окна. у него есть рамка, и эта рамка содержит страницы.
using CommonServiceLocator;
using GalaSoft.MvvmLight.Views;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;

namespace WorldCraft.ViewModel
{
    public class MainWindowViewModel : MainViewModel, INotifyPropertyChanged
    {
        public MainWindowViewModel()
        {
           _page = new Pages.Home();
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        private Page page;

        public Page _page
        {
            get
            {
                return page;
            }

            set
            {
                page = value;         
                this.OnPropertyChanged("page");
                
            }
        }
    }
}


это xaml для главной страницы.
<Window x:Class="WorldCraft.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:WorldCraft"

        mc:Ignorable="d"

        Title="MainWindow" Height="450" Width="800"

        DataContext="{Binding MainWindow, Source={StaticResource Locator}}">
    <Grid>
        <Frame Content="{Binding Path=_page, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    </Grid>
</Window>


Это код для первой страницы, которая называется Home. Он должен переключиться на другую страницу под названием WorldEditor.
using CommonServiceLocator;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using GalaSoft.MvvmLight.Ioc;
using GalaSoft.MvvmLight.Views;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using WorldCraft.ViewModel.Commands;

namespace WorldCraft.ViewModel
{
    public class HomeViewModel : MainViewModel
    {

        public NavigateCommand navigateCommand { get; private set; }

        public HomeViewModel()
        {
            navigateCommand = new NavigateCommand(SwitchTest);
            
        }

        public void SwitchTest()
        {
            ServiceLocator.Current.GetInstance<MainWindowViewModel>()._page = new Pages.WorldEditor();

        }

        


    }
}


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

Что я уже пробовал:

поиск в интернете, но трудно описать мою проблему в google, если нет никакого вывода любого рода.

George Swan

А этого не должно быть.OnPropertyChanged имеет параметр "страница", а не "страница"

dolfijn3000

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

George Swan

попробуйте изменить его с "Страница" на имя вашего свойства "_page"

dolfijn3000

_page не содержит этого значения. данные страницы хранятся в page.

George Swan

метод OnPropertyChanged должен ссылаться на имя свойства, на которое он ссылается, которое является _page, а не page

dolfijn3000

но значение _page никогда не обновляется, так что тогда onproperty changed никогда не будет уволен.

dolfijn3000

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

George Swan

Это должно сделать трюк

dolfijn3000

так что я сделал это, и это сработало. спасибо за помощь и извините, что я был настроен скептически. я новичок в этом, и сначала это не имело для меня никакого смысла.

George Swan

Мы всегда рады вам. При использовании магических строк часто возникает проблема неправильного ввода.

1 Ответов

Рейтинг:
0

Ashutosh Gpt

this.OnPropertyChanged(nameof(_page));
должен работать.
строительство notifyproperychange на собственность тип не является типом класса