我对 WPF 开发很陌生,目前我正在尝试在我的应用程序开发中使用 MVVM。我已经阅读了很多关于 MVVM 导航和切换 View 的内容,但我找不到适合我当前情况的解决方案。让我们解释一下它是什么:
首先,我有我的主 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 中加载的数据模板,这里有一个数据模板作为示例:
<Window.Resources>
<DataTemplate DataType="{x:Type ViewModel:FileLoaderVM}">
<View:FileLoaderView/>
</DataTemplate>
</Window.Resources>
这个 FileLoader( View 和 View 模型是使用 RelayCommand 和 INotifyPropertyChanged 实现的)在单击按钮后打开一个对话框,在选择文件后打开并解析它,并在 ListView 中显示所有找到的元素,并带有多个选择(在这种情况下,有数据的人)。
我现在要做的是在单击按钮时在此 ContentControl 中加载另一个用户控件。这个按钮在我的 View 模型中定义如下:
public ICommand LoadPersons
{
get { return new RelayCommand(param => this.loadSelectedPersons(), param => (SelectedPersons!=null && SelectedPersons.Any()));}
}
我的问题出现在这一点上,如何修改 ContentControl 的内容,直接从我的 View 模型加载另一个用户控件而不是当前的用户控件(在这个“this.loadSelectedPersons()”中)?
如果这是不可能的,我应该如何解决这个问题?
在此操作旁边,我想显示所有先前选择的元素并以不同的可能方式进行操作(插入数据库,保存在另一个文件中等等),并且我已经有了合适的用户控件,我想要在 ContentControl 部分的主视图元素中显示,保持其他元素原样。
最佳答案
让我们看看我是否正确。
您有一个主视图模型,其属性 (CurrentMainViewElementViewModel) 绑定(bind)到 ContentControl。您的 MainViewmodel 将 FileLoaderVM 设置为此属性。现在您想在 FileLoaderVM 中选择文件时显示“新/其他” View 模型?
为什么不简单地从 FileLoaderVM 公开一个事件并在 MainViewModel 中订阅该事件?如果您这样做,您的 MainViewModel 可以将“新/其他” View 模型设置为 ContentControl
关于c# - 在 WPF/MVVM 上导航/加载不同的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26931765/