使用复杂视图来处理TabControl的正确方法是什么?

时间:2014-02-09 20:53:38

标签: wpf tabcontrol

我的申请是针对医疗诊所而我选择一名患者,然后有几个标签可供选择,患者信息,家族史等。我开始使用MainView中的所有选项卡,但由于屏幕的复杂性,我们得出的结论是每个选项卡都需要位于不同的视图上。

如何在多个视图中共享患者信息?所有屏幕都以某种方式与患者相关,我已经走了MainViewModel的道路,托管所有数据,但这似乎是一个坏主意,因为我在不同的视图上操作数据,需要将更新返回到MainViewModel。什么是正确的方法,我已经在互联网上搜索了几天看不同的架构,几乎没有运气找到任何类型的类似架构。

我所做的是让每个ViewModel都能访问患者数据,请使用下面的代码。

        <TabControl Grid.Row="2" x:Name="TC">

        <TabItem Header="Patient Info" IsEnabled="{Binding IsPatientSet}" DataContext="{Binding}">
            <view:TabPatientView DataContext="{Binding ElementName=TC, Path=DataContext}" />
        </TabItem>

        <TabItem Header="Clinical Worksheet" IsEnabled="{Binding IsPatientSet}">

我将每个ViewModel绑定到MainViewModel,因为每个ViewModel只是Patient Info的一个方面。效果很棒!

1 个答案:

答案 0 :(得分:1)

程序的架构取决于不同的变量,我无法给你一个正确的答案。 但是,我可以提出一些方法来解决您的问题:

  1. 保留一个Master ViewModel(这就是你现在正在做的事情)。为每个View创建一个ViewModel,并使用公共类(例如Service)在View模型之间共享患者信息。在这种情况下,服务还可以暴露在患者信息改变时可以引发的事件。

  2. 使用轻量级WPF基础架构(如MVVM Light Toolkit)通过使用Messenger实例共享患者信息的更改。 (与选项2类似,但使用免费的第三方基础设施)

  3. 使用PRISM与DI。

  4. 如果所有View-ViewModel代码都驻留在同一个DLL中,您可以考虑使用选项2或3。 如果某些View-ViewModel驻留在不同的程序集中,您可以考虑使用显示EventAggregator设计模式的选项4。

    希望这有助于您走上正确的道路。