[英]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
)。
这是我的建议。
定义一个将包含区域的主视图:
<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的视图模型定位器自动连接它们。
您的主视图:
<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实例化视图模型。
像这样:
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.