Listview包含来自两个视图模型的数据

时间:2013-01-23 11:32:24

标签: c# wpf mvvm

我有两个viewmodel,每个viewmodel都有一个observablecollection。 这些集合彼此有关系。 例如,假设一个是ClassA的集合,它具有Id和Name,另一个是ClassB的集合,具有ClassAId和一些OtherValue 是否可以将这些数据绑定到ListView,以便对于CollectionA中的每个项目,从CollectionB中提取OtherValue

   <ListView ItemsSource="{Binding ViewModelA.CollectionClassA}">
       <ListView.View>
          <GridView>                            
            <GridViewColumn DisplayMemberBinding="{Binding Path=ClassA.Name}"/>
            <GridViewColumn DisplayMemberBinding="{Binding Path=ClassB.OtherValue}"/>
          </GridView>
         </ListView.View>
    </ListView>

我希望我对我的问题的解释不会让你感到困惑:)

1 个答案:

答案 0 :(得分:1)

您最好的选择是根据对该集合特殊的新视图模型(或模型)返回在视图模型级别形成的新集合:

public class OtherViewModel
{
    //Expand these if you want to make it INPC
    public int Id { get; private set; }
    public string Name { get; private set; }
    public Foo OtherValue { get; private set; }
}

public class MainViewModel
{
    // Somewhere in MainViewModel, create the collection
    ObservableCollection<OtherViewModel> CreateCollection(ICollection<ClassA> a, ICollection<ClassB> b)
    {
        var mix = a.Join(b, a => a.Id, b => b.Id,
            (a, b) => new OtherViewModel { Id = a.Id, Name = a.Name, OtherValue = b.OtherValue });

        return new ObservableCollection<OtherViewModel>(mix);
    }

    // Expose the collection (possibly INPC if needed)
    public ObservableCollection<OtherViewModel> MixedCollection { get; private set; }
}

XAML:

<!-- Assuming the DataContext is MainViewModel -->
<ListView ItemsSource="{Binding MixedCollection}">
  <ListView.View>
    <GridView>                            
      <GridViewColumn DisplayMemberBinding="{Binding Path=Name}"/>
      <GridViewColumn DisplayMemberBinding="{Binding Path=OtherValue}"/>
    </GridView>
  </ListView.View>
</ListView>

注意事项:

  • 您可以选择是否使用ObservableCollection<T>,如果您需要此集合可以观察,则由您决定。
  • 您还可以展开您的视图模型以订阅ClassAClassB个集合,以便当它们中的任何一个发生更改时,它可以更新您的主要集合。

无论哪种方式,这都应该让您对进入的方向有所了解,并进行一些小的调整以适应您的代码。