在我最近提出的另一个问题中,有人告诉我使用 aCompositeCollection
来访问 a 的各种来源ListBox
。
该示例使用 aXmlDataProvider
来提供一些虚拟数据。但是,我有一个包含数据的视图模型。
我花了一些时间来绑定我ListBox
的视图模型的数据。最终我想通了,但现在我想了解为什么我以前的方法不起作用。
成功的关键是 CollectionViewSource。我最初的尝试是:
<CollectionContainer Collection="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Movies}"/>
<CollectionContainer Collection="{Binding ElementName=Window, Path=DataContext.Movies}"/>
我的想法是找到具有适当 DataContext 的 Window,并绑定数据。你可以通过FindAncestor
或 via做到这一点ElementName
,所以我都试过了。这对我来说似乎很合乎逻辑,但显然我错了。运行应用程序时,我什么也没看到。
我还尝试绑定另一个具有数据上下文的控件;例如StackPanel
.
那么,为什么我不使用FindAncestor
and ElementName
1获取数据,而必须CollectionViewSource
明确提供?
这是有效的代码。
<StackPanel DockPanel.Dock="Top">
<ListBox ItemTemplateSelector="{StaticResource CustomDataTemplateSelector}">
<ListBox.Resources>
<CollectionViewSource x:Key="ViewSource" Source="{Binding Movies}"/>
</ListBox.Resources>
<ListBox.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource ViewSource}}"/>
<CollectionContainer Collection="{Binding Source={StaticResource MyButtonsData}}"/>
</CompositeCollection>
</ListBox.ItemsSource>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True"
Width="{Binding (FrameworkElement.ActualWidth),
RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
</StackPanel>
1不,我没有忘记给窗口命名,也没有错字。