【问题标题】:navigation/load different views on WPF/MVVM在 WPF/MVVM 上导航/加载不同的视图
【发布时间】:2014-11-14 14:04:37
【问题描述】:

我对 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 中加载的数据模板,这里有一个数据模板作为示例:

<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 的内容,直接从我的视图模型加载另一个用户控件而不是当前的用户控件(在这个“this.loadSelectedPersons()”中)? 如果这是不可能的,我应该如何解决这个问题? 在此操作旁边,我想显示所有先前选择的元素并以不同的可能方式进行操作(插入数据库,保存在另一个文件中等等),并且我已经有了合适的用户控件,我想要在 ContentControl 部分的主视图元素中显示,其他元素保持原样。

【问题讨论】:

  • 每次访问该属性时都返回一个新的 ICommand?这根本不对。

标签: c# wpf mvvm view navigation


【解决方案1】:

让我们看看我是否说对了。

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

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

【讨论】:

  • 您的解决方案对我有用,感谢您的回答。
【解决方案2】:

要更改ContentControl 的内容,您不需要加载另一个用户控件,而是将CurrentMainViewElementViewModel(绑定到ContentControl.Content)的值更改为新的ViewModel,它将加载另一个UserControl(在DataTemplate 中定义与FileLoaderVM 相同)。

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

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

public Switch()
{
    CurrentMainViewElementViewModel = SomeViewModel;
}

并从FileLoaderVM 调用此方法。

【讨论】:

    猜你喜欢
    • 2013-11-08
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多