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

时间:2014-11-14 14:04:37

标签: c# wpf mvvm view navigation

我是WPF开发的新手,目前我正在尝试在我的应用程序开发中使用MVVM。我已经阅读了很多关于MVVM导航和切换视图的内容,但我无法找到适合我当前情况的解决方案。让我们来解释一下它是什么: 首先,我有我的主要View元素,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中加载的DataTemplates,这里有一个数据模板作为示例:

<Window.Resources>
    <DataTemplate DataType="{x:Type ViewModel:FileLoaderVM}">
        <View:FileLoaderView/>
    </DataTemplate>
</Window.Resources>

此FileLoader(使用RelayCommand和INotifyPropertyChanged实现视图和视图模型)在单击按钮后打开一个对话框,在选择文件后打开并解析它,并在ListView中显示所有找到的元素多重选择(在这种情况下,人员及其数据)。 我现在要做的是在单击按钮时在此ContentControl中加载另一个用户控件。此按钮在我的视图模型中定义如下:

public ICommand LoadPersons
    {
        get { return new RelayCommand(param => this.loadSelectedPersons(), param => (SelectedPersons!=null && SelectedPersons.Any()));}
    }

我的问题是,我如何修改ContentControl的内容,直接从我的视图模型中加载另一个用户控件而不是当前的用户控件(在此&#34; this.loadSelectedPersons()&#34; )? 如果这是不可能的,我应该如何解决这个问题呢? 在此操作旁边,我想显示所有以前选择的元素并以不同的方式操作(插入数据库,保存在另一个文件中等等),我已经为此设置了相应的用户控件,我希望在ContentControl部分的主视图元素中显示,保持原始的其他元素。

2 个答案:

答案 0 :(得分:1)

让我看看我是否帮助你。

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

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

答案 1 :(得分:1)

要更改ContentControl的内容,您不加载其他用户控件,但将CurrentMainViewElementViewModel(绑定到ContentControl.Content的值)更改为新的ViewModel,它将加载另一个UserControl(以DataTemplateFileLoaderVM相同的方式定义)。

这看起来像是主ViewModel(CurrentMainViewElementViewModel所在的位置)的作业。

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

public Switch()
{
    CurrentMainViewElementViewModel = SomeViewModel;
}

并从FileLoaderVM调用此方法。