c# - MVVM:页面内的框架导航

标签 c# mvvm mvvm-light windows-10

我的应用程序正在使用 SplitView其中有一个 Frame因为它的内容。我似乎无法弄清楚如何使用 Split View中的按钮来更改框架中的页面。现在我正在尝试绑定(bind) SourcePageType到我的 View 模型,但这不起作用。这是我的设置。

框架

<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 Light。做这个的最好方式是什么?

最佳答案

我也一直在使用 mmvm light 来解决这个问题,并想出了这个方法,我在主窗口中使用了一个内容控件,该控件绑定(bind)到我想要显示的选定 View 模型。它可能有点矫枉过正,但它有效并且维护起来并不难。

在主页 View 模型中,我创建了一个菜单对象:

  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"
        });

我有以下 INotifyable 属性:
 public MenuMessage selectedmenuitem
  public ObservableCollection<MenuMessage> MenuMessages
 public Object selectedViewModel

此外,我使用的每个 View 模型都是 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>

在 View 模型中,我在 selectedmenuitem setter 的 RaisePropertyChanged 之后调用以下方法:
 private void switchviewmodel()
    {
        switch (selectedmenuitem.viewModelName)
        {
            case "FirstPageViewModel":
                selectedVM = irstpageviewmodel;
                break;
            case "2PageViewModel":
                selectedVM = 2pageviewmodel;
                break;
         }
    }    

关于c# - MVVM:页面内的框架导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33160861/

相关文章:

c# - MVVM轻掷(您是否忘记了调用> NavigationService.Configure?参数名称: pageKey) exception

c# - 如何在用户控件之间进行通信

c# - 随机化一个 List<T>

c# - 在 Fluent NHibernate 中通过 ID 设置引用的实体

mvvm - 天数计算方法(使用 ZK 和 MVVM)

c# - 我应该使用什么类型的项目进行集成测试

c# - MVVM 和命名约定

c# - 如何从客户端记录完整的原始 WCF 客户端请求?

c# - C#中的@语法是什么

mvvm - 为什么在 mvvmlight 的默认实现中有一个公共(public)常量字符串属性?