我是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部分的主视图元素中显示,保持原始的其他元素。
答案 0 :(得分:1)
让我看看我是否帮助你。
你有一个mainviewmodel,它有一个绑定到ContentControl的属性(CurrentMainViewElementViewModel)。您的MainViewmodel将FileLoaderVM设置为此属性。现在你想在FileLoaderVM中选择文件时显示“新/其他”Viewmodel?
为什么不简单地从FileLoaderVM公开事件并在MainViewModel中订阅此事件?如果您这样做,您的MainViewModel可以将“新/其他”Viewmodel设置为ContentControl
答案 1 :(得分:1)
要更改ContentControl
的内容,您不加载其他用户控件,但将CurrentMainViewElementViewModel
(绑定到ContentControl.Content
的值)更改为新的ViewModel,它将加载另一个UserControl
(以DataTemplate
与FileLoaderVM
相同的方式定义)。
这看起来像是主ViewModel(CurrentMainViewElementViewModel
所在的位置)的作业。
最简单的解决方案是在ViewModel中提供一种方法
public Switch()
{
CurrentMainViewElementViewModel = SomeViewModel;
}
并从FileLoaderVM
调用此方法。