gpt4 book ai didi

wpf - 如何在不使用 WPF/MVVM 中的依赖解析器的情况下初始化嵌套 View (和 ViewModel)

转载 作者:行者123 更新时间:2023-12-03 10:04:12 25 4
gpt4 key购买 nike

我正在设计一个遵循 MVVM 模式的 WPF 应用程序。合一UserControl (实际上这种情况发生了很多次),因为它非常复杂,例如,TabControl ,我想把它们分成几个子UserControl .例如,在“主” View 中,我们称它为 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 >

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

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

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

最佳答案

您可以使用隐式数据模板将您的数据 (VM) 链接到您的 View 。首先,在您的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>

然后将选项卡的内容绑定(bind)到子虚拟机:
<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" />

关于wpf - 如何在不使用 WPF/MVVM 中的依赖解析器的情况下初始化嵌套 View (和 ViewModel),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19491612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com