页面内的框架导航

本文关键字:框架 导航 | 更新日期: 2023-09-27 18:18:06

我的应用程序是利用一个SplitView有一个Frame作为它的内容。我似乎不知道如何使用分屏视图中的按钮来改变框架中的页面。现在我正试图将SourcePageType绑定到我的视图模型,但这不起作用。这是我的设置。

<SplitView.Content>
        <Frame x:Name="frame" SourcePageType="{Binding FrameSource}">
            <Frame.ContentTransitions>
                <TransitionCollection>
                    <NavigationThemeTransition>
                        <NavigationThemeTransition.DefaultNavigationTransitionInfo>
                            <EntranceNavigationTransitionInfo/>
                        </NavigationThemeTransition.DefaultNavigationTransitionInfo>
                    </NavigationThemeTransition>
                </TransitionCollection>
            </Frame.ContentTransitions>
        </Frame>
    </SplitView.Content>

视图模型
private string frameSource;
    public string FrameSource
    {
        get { return frameSource; }
        set
        {
            frameSource = value;
            RaisePropertyChanged("FrameSource");
        }
    }
    private RelayCommand<string> navCommand;
    public RelayCommand<string> NavCommand
    {
        get
        {
            navCommand = new RelayCommand<string>(ExecuteNav);
            return navCommand;
        }
    }
    public void ExecuteNav(string page)
    {
        FrameSource = page;
    }

我使用MVVM光我的框架。最好的方法是什么?

页面内的框架导航

我也一直在努力使用mmvm光,并提出了这个方法,我在主窗口中使用一个内容控件绑定到我想要显示的选定视图模型。这可能有点矫枉过正,但它很有效,而且维护起来并不难。

在主页视图模型中,我创建了一个菜单对象:
  private void constructMenu()
    {
        MenuMessages = new ObservableCollection<MenuMessage>();
        MenuMessages.Add(new MenuMessage
        {
            menutext = "FirstPage",
            isactive = true,
            newWindow = false,
            viewModelName = "FirstPageViewModel"
        });
        MenuMessages.Add(new MenuMessage
        {
            menutext = "2page",
            isactive = true,
            newWindow = false,
            viewModelName = "2pageViewModel"
        });

我有以下inotifable属性:

 public MenuMessage selectedmenuitem
  public ObservableCollection<MenuMessage> MenuMessages
 public Object selectedViewModel

另外,我使用的每个视图模型都是一个INotifyable属性

public FirstPageViewModel firstpageviewmodel;
public 2PageViewModel firstpageviewmodel;

我的主页xaml看起来像这样:

<Window
    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:Myproj"
    xmlns:Views="clr-namespace:Myproj.Views"
    xmlns:vm="clr-namespace:Myproj.ViewModel"
    x:Class="Myproj.MainWindow"  mc:Ignorable="d"
    DataContext="{Binding Main, Source={StaticResource Locator}}">
        <Window.Resources>
    <DataTemplate DataType="{x:Type vm:FirstPageViewModel}">
        <Views:FirstPageView/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type vm:2PageViewModel}">
        <Views2pageView/>
    </DataTemplate>
  </Window.Resources>
<DockPanel  LastChildFill="True">
    <StackPanel DockPanel.Dock="Top" >
        <ListView ItemsSource="{Binding MenuMessages}"  SelectedItem="{Binding selectedmenuitem}" >
            <ListView.ItemsPanel>
                <ItemsPanelTemplate> <StackPanel Orientation="Horizontal"/></ItemsPanelTemplate>                    
            </ListView.ItemsPanel>
            <ListView.ItemTemplate>
                <DataTemplate  DataType="{x:Type MenuItem}" >
                    <TextBlock Text="{Binding menutext}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
     </StackPanel>  
        <ContentControl  Content="{Binding selectedVM}" ></ContentControl>
 </DockPanel>

在视图模型中,我在selectedmenuitem setter的RaisePropertyChanged之后调用以下方法:

 private void switchviewmodel()
    {
        switch (selectedmenuitem.viewModelName)
        {
            case "FirstPageViewModel":
                selectedVM = irstpageviewmodel;
                break;
            case "2PageViewModel":
                selectedVM = 2pageviewmodel;
                break;
         }
    }