繁体   English   中英

如何使用Prism的viewlocator将多个ViewModel连接到单个View?

[英]How to connect multiple ViewModels to a single View with Prism's viewlocator?

我使用Prism的viewlocator连接View和ViewModel,并遵循惯例,将View放置在view文件夹内,将ViewModel放置在viewmodel文件夹内,并在viewmodel类的名称后添加后缀viewmodel。 一切正常。 我只是想知道如何将多个视图模型连接到单个视图?

例如,我有:

视图: CustomerView ,在XAML中,我只需使用: prism:ViewModelLocator.AutoWireViewModel="True"

ViewVodel: CustomerViewModel

现在我想添加CustomerViewModel2 ,但是它不起作用,因为它与视图的名称不匹配

正如我在评论中提到的那样,不可能将单个视图与多个(相同级别)视图模型直接连接。

您必须将视图分为主视图和(几个)子视图(在XAML中逻辑上或在物理上通过将子视图移动到单独的UserControl )。

这是我的建议。

  1. 使用棱镜区域。

定义一个将包含区域的主视图:

<Window>
    <StackPanel Orientation="Vertical">
        <ContentControl prism:RegionManager.RegionName="Region1"/>
        <ContentControl prism:RegionManager.RegionName="Region2"/>
    </StackPanel>
</Window>

创建将“插入”(以PRISM的术语-注入)到主视图的子视图:

<UserControl x:Class="UserControl1">
    <Grid/>
</UserControl>

<UserControl x:Class="UserControl2">
    <Grid/>
</UserControl>

最后,您必须在PRISM中注册您的视图,以便可以实例化它们:

// Obtain the region manager over DI
IRegionManager regionManager;
regionManager.RegisterViewWithRegion("Region1", typeof(UserControl1));
regionManager.RegisterViewWithRegion("Region2", typeof(UserControl2));

这些子视图中的每一个都有自己的视图模型。 您可以使用PRISM的视图模型定位器自动连接它们。

  1. 使用数据模板。

您的主视图:

<Window>
<Window.Resources>
    <DataTemplate DataType="vm:ViewModel1">
        <v:UserControl1/>
    </DataTemplate>
    <DataTemplate DataType="vm:ViewModel2">
        <v:UserControl2/>
    </DataTemplate>
</Window.Resources>
    <ItemsControl ItemsSource="{Binding Items}"/>
</Window>

将子视图模型添加到主视图模型的Items集合中,WPF将创建视图并自动将视图模型与其连接。

class MasterViewModel : BindableBase
{
    public IEnumerable<BindableBase> Items
    {
        get { return new[] { new ViewModel1(), new ViewModel2() }
    }
}

当然,您可以使用DI实例化视图模型。

  1. 使用“堆叠”视图模型。

像这样:

class MainViewModel : BindableBase
{
    public ViewModel1 ViewModel1 { get; private set; }
    public ViewModel2 ViewModel2 { get; private set; }
}

在主视图中,您将必须相应地设置绑定。

<Window>
    <StackPanel>
        <TextBlock Text="{Binding ViewModel1.SomeValue}"/>
        <TextBox Text="{Binding ViewModel2.SomeValue}"/>
    </StackPanel>
</Window>

您可以将子视图模型公开为页面的主视图模型的属性,然后在绑定中以属性名称为子视图模型的路径添加前缀。

将视图模型设置为局部类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM