wpf - 将 View 拆分为两个单独的 View

标签 wpf user-interface mvvm viewmodel

我正在构建一个非常简化的 WPF 应用程序,如下所示:

My WPF application

我有一个包含菜单和 ContentControl 的 ApplicationView。
ContentControl 绑定(bind)到由菜单设置并由其相关 View 呈现的 CurrentViewModel 属性( View 和 ViewModel 由 App.xaml 中定义的 DataTemplates 耦合)。

我在 Rachel Lim's blog 上找到了这种方法

所以在这个例子中,我的 View 包含一个职责列表以及当前选定职责的“详细信息”窗口。

这个设置工作正常,但我认为我的 ViewModel 太胖了!
这个 ViewModel 的非简化版本大约有 500 行代码,用于处理:

  • 初始化过滤器
  • 过滤列表逻辑
  • 显示职责详情
  • 添加/更新/取消/删除逻辑

  • 现在我对 WPF 很陌生,但这似乎代码太多了,是吗?
    在我完成之前它会更大。

    无论如何,我在想我可以将 ViewModel 分成两个单独的 ViewModel;一个用于保存列表和过滤器,一个用于显示详细信息。但这如何最好地完成?

    我想到了两种方法,但不知道哪种方法更可取:
  • 创建一个 DutyMasterView,其唯一目的是为实际 View 保存两个 ContentControl(即 DutyListView 和 DutyDetailView,每个都有自己的 ViewModel)?
    我使用 MVVM Light 作为我的框架,所以我想我可以使用消息传递服务来告诉 DutyDetailViewModel 显示哪个 Duty,对吧?
    或者,创建一个公开所选职责的 DutyMasterViewModel。
  • 抛弃 DutyMasterView 并将 DutyDetailView 嵌套在 DutyListView 中。

  • 将我的 ViewModel 一分为二是否有意义,或者我应该坚持使用我的胖 ViewModel?
    如果建议拆分 ViewModel,我的哪个建议最有意义?
    还有其他我应该考虑的方法吗?

    最佳答案

    如果您仍在寻找意见,我会像您在第 1 点中提到的那样做,但您不需要任何消息传递。
    您创建两个 VM。比方说 DutiesVM 和 DutyDetailVM。 DutyDetailsVM 仅包含 ID 和 Name 的一些字符串属性。
    在 DutiesVM 中,您创建两个属性:

    ObservableCollection<DutyDetailVM> DutiesList
    DutyDetailVM SelectedDuty
    

    您的 DutiesView 可能如下所示:
    <DockPanel>
        <v:DutyDetailV DockPanel.Dock="Right" DataContext="{Binding SelectedDuty}">
        <ListBox ItemsSource="{Binding DutiesList}" SelectedItem="{Binding SelectedDuty}"/>
    </DockPanel>
    

    现在您可以创建绑定(bind)到 DutyDetailVM 属性的 ListView ItemTemplate。
    是定义 DutyDetail View 的用户控件。选择列表中的项目会自动更新详细信息控件。

    这只是草图,但我认为你可以从中得到重点。

    关于wpf - 将 View 拆分为两个单独的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20047999/

    相关文章:

    wpf - 如何在拖动 Thumb 时捕获 MouseEnter?

    c# - WPF-如何使用ViewModel的ObservableCollection显示TabItem?

    java - 向用户提供反馈的最佳方式是什么

    wpf - WPF 中的确定性和异步字段验证

    c# - 在 WPF 中暂停 Storyboard?

    c# - WPF (with C#) 文本框光标位置问题

    Java:在 JPanel/JFrame 中创建可编辑的项目列表

    r - 使用 GUI 部署 R 应用程序

    c# - MVVM:我是否使用事件或方法调用在 ViewModel 和 Model 之间进行通信

    mvvm - 带有 MVVM 的 WPF 工具包 DataGrid MultiSelect