Привязка 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
Мы всегда рады вам. При использовании магических строк часто возникает проблема неправильного ввода.