首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在一个框架中的多个页面之间导航,在WPF C#中

如何在一个框架中的多个页面之间导航,在WPF C#中
EN

Stack Overflow用户
提问于 2021-02-12 12:15:09
回答 1查看 212关注 0票数 1

我有:

  • MainWindow.xaml (在我有框架的地方)
  • LoginPage.xaml
  • SignUpPage.xaml

以下是MainWindow.xaml中的框架:

代码语言:javascript
复制
  <Frame x:Name="MainPage"
               Content="{Binding ApplicationViewModel.CurentPage,
                                Source={x:Static viewMod:ViewModelLocator.Instanze},
                                Converter={local:ApplicationPageValueConverter}}"/>

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

代码语言:javascript
复制
 public class ApplicationViewModel 
 {
    /// <summary>
    /// The current page of the application
    /// </summary>
    public ApplicationPage CurentPage { get; set; } = ApplicationPage.Login;
 }

ViewModelLocatorIoC中定位视图模型,以用于Xaml文件中的绑定。

代码语言:javascript
复制
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中,为了转换页面,我有以下内容:

代码语言:javascript
复制
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;
   }
}

MainViewModel (即ViewModel for MainWindow.xaml.cs )中,我有一个按钮"SignUp",当我单击该按钮时,将执行正在执行此操作的ICommand

代码语言:javascript
复制
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在这里做这个:

代码语言:javascript
复制
base.OnStartup(e);

IoC.SetUp();
....

我不知道为什么它没有显示页面,我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-12 15:40:38

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

代码语言:javascript
复制
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));
}

要将更改通知视图并再次调用转换器,就需要这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66171714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档