【问题标题】:Can a View have two View Models as its Data Context?一个视图可以有两个视图模型作为它的数据上下文吗?
【发布时间】:2012-06-02 15:45:09
【问题描述】:

我在一个视图中有两个数据网格,但作为这些数据网格的 ItemsSource 的集合位于不同的视图模型中。那么是否可以将这两个数据网格与两个不同视图模型中的集合绑定?

【问题讨论】:

    标签: wpf xaml binding


    【解决方案1】:

    您可以为每个 DataGrid 而不是容器视图设置 DataContext。

    <Grid>
       <DataGrid ... DataContext="..." />
       <DataGrid ... DataContext="..." />
    </Grid>
    

    或者不使用 DataContext 直接绑定到模型

    <DataGrid ItemsSource="{Binding Source={StaticResource ...}}" />
    

    【讨论】:

      【解决方案2】:

      寻求结合两者的视图模型:

      public class ViewModelA {
          public ObservableCollection<CustomClass> Items { get; set; }
          /* properties, etc. */
      }
      
      public class ViewModelB {
          /* properties, etc. */
      }
      
      public class CombiningViewModel {
          public ViewModelA A { get; set; }
          public ViewModelB B { get; set; }
      }
      

      绑定可以像

      <DataGrid ItemsSource="{Binding A.Items}">
          <!-- Sample, not complete -->
      </DataGrid>
      

      【讨论】:

      • +1 在这种情况下,我也会选择复合 ViewModel。
      【解决方案3】:

      不,不是直接的。不过,您确实有选择:

      您可以将视图的 DataCONtext 设置为自身,然后通过单独的属性公开每个视图模型并绑定到这些属性:

      public class MyView : Window 
      {
          public MyView()
          {
              this.DataContext = this;
          }
      
          public ViewModel1 FirstViewModel { get; set; }
      
          public ViewModel2 SecondViewModel { get; set; }
      
      }
      

      或者您可以创建一个包装器视图模型,它可以扩展(继承)其中一个视图模型,或者将它们都包装起来并显示适当的属性:

      public class MyCompositeViewModel
      {
          public ViewModel1 FirstViewModel { get; set; }
      
          public ViewModel2 SecondViewModel { get; set; }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-24
        • 2014-03-20
        • 1970-01-01
        相关资源
        最近更新 更多