首页 > 解决方案 > 如何在 WPF C# 中在一帧中的多个页面之间导航

问题描述

我有 :

这是 MainWindow.xaml 中的框架:

  <Frame x:Name="MainPage"
               Content="{Binding ApplicationViewModel.CurentPage,
                                Source={x:Static viewMod:ViewModelLocator.Instanze},
                                Converter={local:ApplicationPageValueConverter}}"/>

ApplicationViewModel是作为视图模型的应用程序状态:

 public class ApplicationViewModel 
 {
    /// <summary>
    /// The current page of the application
    /// </summary>
    public ApplicationPage CurentPage { get; set; } = ApplicationPage.Login;
 }

ViewModelLocatorIoC从用于绑定 Xaml 文件中的视图模型中定位

public class ViewModelLocator
{
   /// <summary>
   /// Singleton instance of the locator
   /// </summary>
   public static ViewModelLocator Instance { get; private set; } = new ViewModelLocator();

   /// <summary>
   /// The application view model
   /// </summary>
   public static ApplicationViewModel ApplicationViewModel => IoC.Get<ApplicationViewModel>();   
 }

ApplicationPageValueConverter我有这个,转换页面:

public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
          
  switch ((ApplicationPage)value)
  {
      case ApplicationPage.Login:
           return new LoginPage(); 
                
      case ApplicationPage.SignUp:
           return new SignUpPage();

      default:
        Debugger.Break();
         return null;
   }
}

在MainWindow.xaml.csMainViewModelViewModel,我有一个“SignUp”按钮,当我单击该按钮时,将执行ICommand谁在执行此操作:

public ICommand LoginCommand { get; set; }      
LoginCommand = new RelayCommand(() => Login());

private void Login()
{
  IoC.Get<ApplicationViewModel>().CurentPage = ApplicationPage.SignUp;
}

的值ApplicationViewModel.CurentPage 已更改为,ApplicationPage.SignUp但不会ApplicationPageValueConverter转换/显示页面。

这是我正在执行此操作的IoC 代码:OnStartup

base.OnStartup(e);

IoC.SetUp();
....

我不明白为什么它不显示页面,我做错了什么?

标签: c#wpfxaml

解决方案


ApplicationViewModel只要设置了属性,就应该实现INotifyPropertyChanged并引发事件:PropertyChangedCurrentPage

public class ApplicationViewModel : INotifyPropertyChanged
{
    private ApplicationPage _currentPage = ApplicationPage.Login;

    /// <summary>
    /// The current page of the application
    /// </summary>
    public ApplicationPage CurentPage
    {
        get { return _currentPage; }
        set { _currentPage = value; NotifyPropertyChanged(); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "") =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

这是通知视图更改和再次调用转换器所必需的。


推荐阅读