我正在构建一个非常简化的 WPF 应用程序,如下所示:
我有一个包含菜单和 ContentControl 的 ApplicationView。
ContentControl 绑定(bind)到由菜单设置并由其相关 View 呈现的 CurrentViewModel 属性( View 和 ViewModel 由 App.xaml 中定义的 DataTemplates 耦合)。
我在 Rachel Lim's blog 上找到了这种方法
所以在这个例子中,我的 View 包含一个职责列表以及当前选定职责的“详细信息”窗口。
这个设置工作正常,但我认为我的 ViewModel 太胖了!
这个 ViewModel 的非简化版本大约有 500 行代码,用于处理:
现在我对 WPF 很陌生,但这似乎代码太多了,是吗?
在我完成之前它会更大。
无论如何,我在想我可以将 ViewModel 分成两个单独的 ViewModel;一个用于保存列表和过滤器,一个用于显示详细信息。但这如何最好地完成?
我想到了两种方法,但不知道哪种方法更可取:
我使用 MVVM Light 作为我的框架,所以我想我可以使用消息传递服务来告诉 DutyDetailViewModel 显示哪个 Duty,对吧?
或者,创建一个公开所选职责的 DutyMasterViewModel。
将我的 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/