页面内的框架导航
本文关键字:框架 导航 | 更新日期: 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;
}
}