我使用Prism的viewlocator连接View和ViewModel,我遵循惯例,将View放在viewmodel文件夹中的view文件夹和ViewModel中,并将后缀viewmodel添加到viewmodel类的名称中。一切正常。我只是想知道如何将多个视图模型连接到单个视图?
例如,我有:
查看:prism:ViewModelLocator.AutoWireViewModel="True"
在XAML中,我只使用:CustomerViewModel
ViewVodel:CustomerViewModel2
现在我想添加for(i = 0; i < 4; i++)
{
for(j = 1; j < 4; j++)
{
if(Factors[j] < Factors[j-1])
{
temp = Factors[j-1];
Factors[j-1] = Factors[j];
Factors[j] = temp;
}
}
}
,但它不会起作用,因为它与视图的名称不匹配
答案 0 :(得分:2)
正如我在评论中提到的,没有可能将单个视图与多个(同级别)视图模型直接连接。
您必须将视图拆分为主视图和(多个)子视图(逻辑上在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>
答案 1 :(得分:1)
您可以将子视图模型公开为页面主视图模型的属性,然后使用属性名称将路径前缀添加到绑定中的子视图模型。
答案 2 :(得分:0)
将您的viewmodels设置为部分类。