C# 在WPF/MVVM上导航/加载不同的视图

C# 在WPF/MVVM上导航/加载不同的视图,c#,wpf,mvvm,view,navigation,C#,Wpf,Mvvm,View,Navigation,我是WPF开发的新手,目前我正在尝试在应用程序开发中使用MVVM。我已经读了很多关于MVVM导航和切换视图的书,但是我找不到适合我目前情况的解决方案。让我们解释一下它是什么: 首先,我有一个主视图元素,一个Dockpanel,有一些固定区域,还有一个主“动态”区域,根据操作的不同,内容应该在其中发生变化: <DockPanel> <Label Content="Top Fixed element"/> <StackPanel Orientation=

我是WPF开发的新手,目前我正在尝试在应用程序开发中使用MVVM。我已经读了很多关于MVVM导航和切换视图的书,但是我找不到适合我目前情况的解决方案。让我们解释一下它是什么: 首先,我有一个主视图元素,一个Dockpanel,有一些固定区域,还有一个主“动态”区域,根据操作的不同,内容应该在其中发生变化:

<DockPanel>
    <Label Content="Top Fixed element"/>
    <StackPanel Orientation="Vertical" Height="auto" Width="150" DockPanel.Dock="Left">
        <Label Content="SomeOptions"/>
        <!-- some more elements -->
    </StackPanel>
    <Label DockPanel.Dock="Bottom" Content="Foot"/>        
    <ContentControl Content="{Binding CurrentMainViewElementViewModel}"/>        
</DockPanel>
此时我的问题是,如何修改ContentControl的内容,直接从视图模型(在此“this.loadSelectedPersons()”中)加载另一个用户控件而不是当前用户控件? 如果这是不可能的,我应该如何解决这个问题?
在这个动作的旁边,我想显示所有以前选择的元素,并以不同的可能方式进行操作(插入数据库、保存到另一个文件中等等),我已经有了相应的用户控件,我想在ContentControl部分的主视图元素中显示它,保持其他元素的原始状态。

让我们看看是否正确

您有一个属性(CurrentMainViewElementViewModel)绑定到ContentControl的mainviewmodel。MainViewmodel将FileLoaderVM设置为此属性。现在,您想在FileLoaderVM中选择文件时显示“新建/其他”视图模型吗


为什么不从FileLoaderVM中公开一个事件并在MainViewModel中订阅此事件?如果这样做,则MainViewModel可以将“新建/其他”Viewmodel设置为ContentControl

以更改
ContentControl
的内容,您不会加载另一个用户控件,而是将
CurrentMainViewElementViewModel
的值(与
ContentControl.content
绑定)更改为新的Viewmodel,它将加载另一个
UserControl
(在
DataTemplate
中定义,方式与
FileLoaderVM
相同)

这看起来像是主视图模型的作业(其中
CurrentMainViewElementViewModel

最简单的解决方案是在该ViewModel中提供一个方法

public Switch()
{
    CurrentMainViewElementViewModel = SomeViewModel;
}

并从
FileLoaderVM

调用此方法每次访问属性时是否返回新的ICommand?那完全不对。你的解决方案对我有效,谢谢你的回答。
public ICommand LoadPersons
    {
        get { return new RelayCommand(param => this.loadSelectedPersons(), param => (SelectedPersons!=null && SelectedPersons.Any()));}
    }
public Switch()
{
    CurrentMainViewElementViewModel = SomeViewModel;
}