将视图拆分为两个单独的视图

时间:2013-11-18 12:37:48

标签: wpf user-interface mvvm viewmodel

我正在构建一个非常简化的WPF应用程序:

My WPF application

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

我在Rachel Lim's blog

上找到了这种方法

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

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

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

现在我对WPF很新,但看起来代码太多了,是吗? 在我完成之前它会更大。

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

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

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

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

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

1 个答案:

答案 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。选择列表中的项目会自动更新详细信息控件。

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