6

我正在设计一个遵循 MVVM 模式的 WPF 应用程序。在一个UserControl中(实际上这种情况发生了很多次),因为它非常复杂,例如,TabControl我想将它们分成几个 sub UserControl。例如,在“主”视图中,我们称它为 MainUC,我有一个TabControl,它有两个TabItem。由于两者TabItem实际上都包含很多 UI 元素,所以我设计了两个UserControl,SubUCA 和 SubUCB,所以 MainUC 的 XAML 看起来是这样的:

<TabControl Name="mainUC" Grid.Row="0" >   
    <TabItem Header="Sub UC A" Name="SubUC1">
        <local:SubUCA />
    </TabItem>
    <TabItem Header="Sub UC B" Name="SubUC2">
        <local:SubUCB />
    </TabItem>
</TabControl > 

但现在我的问题是:我应该如何为这些安排 ViewModel(s) UserControl?我目前使用的一种方法是只有一个 ViewModel 类(称为 MainUC_VM),并将DataContextMainUC 的设置为此类实例(请注意,我没有使用依赖注入,所以我只是在代码隐藏中创建一个实例MainUC)。但是这样一来,MainUC_VM 类就会变得非常复杂,就像 MainUC 一样。所以我也想把 ViewModel 分成几个类。例如,在 MainUC_VM 类中,我可以有这样的属性

public SubUCA_VM SubVM1 { get; set; }
public SubUCB_VM SubVM2 { get; set; }

但是,由于我没有使用依赖注入(因为我们的团队还没有决定使用它),我怎样才能让 SubVM1DataContext和 SubVM2 分别成为 SubUC1 和 SubUC2 的?我无法在 SubUCA 和 SubUCB 的代码隐藏中实例化一个,因为它们与 MainUC_VM 中的属性成员不同。

我能想到的一些方法是,1)将 SubUCA_VM 和 SubUCB_VM 类设为单例(这与默认情况下使用例如 MEF 的依赖注入的行为相同),或 2)EvengAggregator用于通知对象的实例化。但在我看来,无论哪种方式似乎都增加了不必要的复杂性。这是否意味着要使用 MVVM,依赖注入几乎是必须的?有没有办法在不使用 DI 的情况下实现它?

4

1 回答 1

4

您可以使用隐式数据模板将您的数据 (VM) 链接到您的视图。首先,在您可用的资源字典中定义数据模板MainUC。这可以在用户控件本身中,甚至在应用程序资源中。这些数据模板指示 WPF 在需要呈现某种类型的数据时使用哪个控件。

<UserControl.Resources>
    <DataTemplate TargetType="{x:Type local:SubUCA_VM}">
       <local:SubUCA />
    </DataTemplate>
    <DataTemplate TargetType="{x:Type local:SubUCB_VM}">
       <local:SubUCB />
    </DataTemplate>
</UserControl.Resources>

然后将选项卡的内容绑定到子虚拟机:

<TabControl Name="mainUC" Grid.Row="0" >   
    <TabItem Header="Sub UC A" Content="{Binding SubVM1}" />
    <TabItem Header="Sub UC B" Content="{Binding SubVM2}" />
</TabControl>

或者,您可以在主 VM 中有一个子 VM列表。每个子 VM 都应该有一个Title属性,以便选项卡控件可以将其用于标题。这样,主 VM 可以动态构建 UI。您仍然需要上面定义的数据模板。

<TabControl ItemsSource="{Binding Children}" DisplayMemberPath="Title" />
于 2013-10-21T10:19:18.040 回答