使用MVVM单击按钮时设置帧内容

时间:2017-11-02 09:45:09

标签: c# wpf mvvm

我是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,我在其中设置应显示的页面。

1 个答案:

答案 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>  

此时,您将在屏幕上显示为您呈现的数据模板的内容。