我是MVVM模式的新手,但我理解其中的一些。我目前遇到的问题是我想在按下按钮时使用MVVM模式打开页面。当按下六个按钮中的一个时,命令可以给我按下按钮的名称。我的问题是,当按下按钮时,我不知道如何设置框架的内容。
<StackPanel>
<Button Content="Page 1" x:Name="Page1"
Command="{Binding SimpleCommand, Source={StaticResource ViewModelBase}}"
CommandParameter="{Binding Name, ElementName=Page1}"/>
<Button Content="Page 2" x:Name="Page2"
Command="{Binding SimpleCommand, Source={StaticResource ViewModelBase}}"
CommandParameter="{Binding Name, ElementName=Page2}"/>
</StackPanel>
上面是XAML代码。 simplecommand只是在按钮上写出名称
<Frame x:Name="MainFrame" Grid.Column="1" Grid.Row="1"
Content="{Binding Name, Converter={StaticResource Converter}, ElementName=Page1}"
NavigationUIVisibility="Hidden"/>
以上是我想要更改内容的框架。在编译时我可以设置它应该打开的页面。我想在运行时设置内容,我使用按钮名称。 转换器只是IValueConverter,我在其中设置应显示的页面。
答案 0 :(得分:1)
我接近这个的方式不是使用框架而是使用ContentPresenter
。您始终可以在ContentPresenter
内插入Frame
。请记住,Frame
不会继承DataContext
,所以我会避免使用它
开始让我们创建一个BaseViewModel
作为我们观点的起点。
public class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
现在我们有了基础让我们创建一个MainViewModel
:
public class MainViewModel : BaseViewModel
{
private BaseViewModel selectedViewModle;
public BaseViewModel SelectedViewModel
{
get { return selectedViewModle; }
set { selectedViewModle = value; OnPropertyChanged(nameof(SelectedViewModel)); }
}
}
此时我们的MainViewModel
有一个SelectedViewModel
的属性,这就是我们要用于导航的内容。
的假设强>
我假设你有关于命令以及如何使用它们的工作知识
以下是导航command
的方法的代码示例:
void navigate(object parameter)
{
SelectedViewModel = new DetailsViewModel();
}
以下是DetailsViewModel
的代码:
public class DetailsViewModel : BaseViewModel
{
//your code with properties and methods here
}
<小时/> 现在让我们设置视图:
<UserControl ...>
<Grid>
<ContentPresenter Content="{Binding .}"/>
</Grid>
</UserControl>
现在,UserControl
的Resources标记中包含DataTemplate
:
<DataTemplate DataType="{x:Type vm:DetailsViewModel}">
<Grid .../>
</DataTemplate>
此时,您将在屏幕上显示为您呈现的数据模板的内容。