【问题标题】:Split view into two separate views将视图拆分为两个单独的视图
【发布时间】:2013-11-18 12:37:48
【问题描述】:

我正在构建一个非常简化的 WPF 应用程序,看起来像这样:

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

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

因此,在本例中,我的视图包含职责列表以及当前所选职责的“详细信息”窗口。

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

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

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

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

我想到了两种方法,但不知道哪种方法更可取:

  1. 创建一个 DutyMasterView,其唯一目的是为实际 View 保存两个 ContentControl(即 DutyListView 和 DutyDetailView,每个都有自己的 ViewModel)? 我使用 MVVM Light 作为我的框架,所以我想我可以使用消息传递服务来告诉 DutyDetailViewModel 显示哪个 Duty,对吧? 或者,创建一个公开所选职责的 DutyMasterViewModel。

  2. 放弃 DutyMasterView 并将 DutyDetailView 嵌套在 DutyListView 中。

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

【问题讨论】:

  • 500 行在我看来不是一个大文件。
  • 决定最适合您的。在我看来,超过 500 LOC 的 ViewModel 往往会变得难以维护。
  • 如果 DutyDetailViewModel 的唯一工作是显示职责,我看不出使用任何消息传递的意义。只需更新 Master VM 中的属性以返回不同的 Detail VM。
  • 方法 #3 - 一个超大型 VM 拆分为 3 个部分类。 :D 笑话

标签: wpf user-interface mvvm viewmodel


【解决方案1】:

如果您仍在寻找意见,我会按照您在第 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>

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多