的解釋你最好的選擇是,以返回在形成一個新的集合基於特定於該集合的新視圖模型(或模型)的視圖模型級別:
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>
與否,就看你是否需要此集合可觀察到。
- 您還可以展開您的視圖模型以訂閱
ClassA
和ClassB
集合,以便在它們中的任何一個更改時更新您的主集合。
無論哪種方式,這應該給你一個很好的想法,進行一些小的調整,以適應你的代碼。
你真的嘗試過嗎?怎麼了? – RhysW
我不知道如何獲得CollectionB綁定,因爲它在其他數據環境中 – Peter
因此,您需要一個包含A和B的包裝,然後將其用作項目源? – RhysW