gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:19:32 26 4
gpt4 key购买 nike

我正在构建一个非常简化的 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com