基本上,CollectionView 是一种在 WPF 中以最简单的方式构建 Master Ditail View 的方法。
首先给大家介绍一下fallback机制。
<Window.Resources>
<x:Array x:Key="planets" Type="{x:Type local:Planets}">
<local:Planets Name="Earth" Diameter="12,756 km" Mass="5.97 10^24kg" Density="5514 kg/m³"/>
<local:Planets Name="Mars" Diameter="6792 km" Mass="0.642 10^24kg" Density="3933 kg/m³"/>
<local:Planets Name="Jupiter" Diameter="142,984 km" Mass="1898 10^24kg" Density="1326 kg/m³"/>
</x:Array>
</Window.Resources>
<DockPanel DataContext="{StaticResource planets}">
<ListBox ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="True"
DisplayMemberPath="Name" Width="125"/>
<StackPanel>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Diameter}"/>
<TextBlock Text="{Binding Mass}"/>
<TextBlock Text="{Binding Density}"/>
</StackPanel>
</DockPanel>
public class Planets
{
public string Name { get; set; }
public string Diameter { get; set; }
public string Mass { get; set; }
public string Density { get; set; }
}
我们有一个Planets 类型的简单数组。
DisplayMemberPath-Property 也设置了Name,因此行星名称显示在ListBox 中。除了ListBox,各个行星的详细信息都显示在TextBlock 中。 Vourla,我们有我们的工作主细节视图,通过后备机制隐式使用CollectionView
由于设置了IsSynchronizedWithCurrentItem="True"属性,WPF会在后台生成Default-CollectioView,并将ListBox中选择的对象保存在CurrentItem-Property中。现在的情况是TextBlock的Binding首先在Planets[]数组上搜索Property;它在那里找不到任何东西,但回退机制将其转发到Default-CollectionView 的CurrentItem-Property。
也可以直接引用Default-CollectionView的CurrentItem-Property。为此,请在Binding 中的Property 前面做一个简单的(/)。
<TextBlock Text="{Binding /Name}"/>
仅当设置了Binding 的Path-Property 时,回退机制才有效。
CollectionViewSource 派生自CollectionView,是提供某些Properties 的代理,例如Source 或View。
还有其他三个派生自CollectionView 的类,它们是ItemCollection、ListCollectionView 和BindingListCollectionView。 类的接口,即它们前面的类型(I),是为了避免与类直接耦合。遵循的原则称为依赖注入
三个类 ItemCollection、ListCollectionView 和 BindingListCollectionView 是为不同的目的而设计的。 ItemCollection 因此提供了一个 IEnumerable、ListCollectionView 一个 IList 和 BindingListCollectionView 一个 IBindingList 对象。因此,为不同的目的提供了不同的类型。
总而言之,CollectionView 是一个强大的 WPF 工具;您可以排序、分组等并显示详细信息。
我希望这可以进一步帮助您。问候迈克尔