我正在构建一个非常简化的WPF应用程序:
我有一个ApplicationView,它包含菜单和ContentControl。 ContentControl绑定到属性CurrentViewModel,该属性由菜单设置并由其相关视图呈现(Views和ViewModel由App.xaml中定义的DataTemplates耦合)。
上找到了这种方法因此,在此示例中,我的视图包含一个职责列表以及当前所选职责的“详细信息”窗口。
此设置工作正常,但我认为我的ViewModel太胖了! 此ViewModel的非简化版本大约有500行代码,用于处理:
现在我对WPF很新,但看起来代码太多了,是吗? 在我完成之前它会更大。
无论如何,我想我可以将ViewModel分成两个独立的ViewModel;一个用于保存列表和过滤器,另一个用于显示详细信息。但这最好的完成了什么?
我想过两种方法,但不知道哪种方法更可取:
创建一个DutyMasterView,其唯一目的是为实际视图保存两个ContentControl(即DutyListView和DutyDetailView,每个都有自己的ViewModel)? 我正在使用MVVM Light作为我的框架,所以我想我可以使用消息服务告诉DutyDetailViewModel显示哪个Duty,对吧? 或者创建一个暴露所选职责的DutyMasterViewModel。
抛弃DutyMasterView并将DutyDetailView嵌套在DutyListView中。
将我的ViewModel分成两部分是否有意义,还是应该坚持使用我的胖ViewModel? 如果建议拆分ViewModel,我的哪些建议最有意义? 我还应该考虑其他方法吗?
答案 0 :(得分:0)
如果您仍在寻找意见,我会像您在第1点中提到的那样做,但您不需要任何消息。 您创建两个VM。让我们说DutiesVM和DutyDetailVM。 DutyDetailsVM只包含ID和Name的一些字符串属性。 在DutiesVM中,您可以创建两个属性:
ObservableCollection<DutyDetailVM> DutiesList
DutyDetailVM SelectedDuty
您的职责视图可能如下所示:
<DockPanel>
<v:DutyDetailV DockPanel.Dock="Right" DataContext="{Binding SelectedDuty}">
<ListBox ItemsSource="{Binding DutiesList}" SelectedItem="{Binding SelectedDuty}"/>
</DockPanel>
现在您可以创建绑定到DutyDetailVM属性的ListView ItemTemplate。 是用于定义DutyDetail视图的usercontrol。选择列表中的项目会自动更新详细信息控件。
这只是草图,但我认为你可以从中得到重点。