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

时间:2016-03-29 13:24:25

标签: c# wpf xaml mvvm prism

我使用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; } } } ,但它不会起作用,因为它与视图的名称不匹配

3 个答案:

答案 0 :(得分:2)

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

您必须将视图拆分为主视图和(多个)子视图(逻辑上在XAML中或通过将子视图移动到单独的UserControl中来实际)。

以下是我的建议。

  1. 使用PRISM区域。
  2. 定义包含区域的主视图:

    <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. 使用数据模板。
    2. 您的主视图:

      <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. 使用“堆叠”视图模型。
      2. 这样的事情:

        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设置为部分类。