gpt4 book ai didi

wpf - CompositeCollection : why can't I bind against the data context of another control but have to use a CollectionViewSource? 的来源

转载 作者:行者123 更新时间:2023-12-01 23:31:10 27 4
gpt4 key购买 nike

another question I recently asked ,我被告知使用 CompositeCollection 来访问 ListBox 的各种源。

该示例使用 XmlDataProvider 来提供一些虚拟数据。但是,我有一个 View 模型,其中包含数据。

我花了一些时间将 ListBox 与 View 模型的数据绑定(bind)。最终我想通了,但现在我想了解为什么我以前的方法不起作用。

成功的关键是 CollectionViewSource。我最初的尝试是:

<CollectionContainer Collection="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Movies}"/>
<CollectionContainer Collection="{Binding ElementName=Window, Path=DataContext.Movies}"/>

我的想法是找到具有适当 DataContext 的窗口,并绑定(bind)数据。您可以通过 FindAncestor 或通过 ElementName 来做到这一点,所以我尝试了这两种方法。这对我来说似乎非常合乎逻辑,但显然我错了。当我运行该应用程序时,我什么也没看到。
我还尝试绑定(bind)另一个具有数据上下文的控件;例如StackPanel。

那么,为什么我不使用 FindAncestorElementName1 获取数据,而是必须提供 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 不,我没有忘记为窗口命名,也没有拼写错误。

最佳答案

我找到了 thread on microsoft.com讨论这个问题。
似乎这个“错误”已经存在多年,但从未得到修复。

那里也建议了我正在使用的解决方法(CollectionViewSource)。

此外,您确实不能使用ElementName。我不知道出于什么原因,但 ElementName 的解决方法是使用 x:Reference 作为 suggested in another question's thread .

<CollectionContainer Collection="{Binding Source={x:Reference dummy}, Path=DataContext.Movies}"/>

有趣的是,XAML 编译器在编辑时会显示对象引用未设置为对象的实例错误。
不过,只要您不使用祖先类型,就可以编译并运行,因为您会因为循环依赖而得到 XmlParseException。

为了避免循环依赖错误,您可以将 CompositeCollection 放入资源中并通过 StaticResource 链接到那里。那么您也可以使用祖先类型。

<ListBox.Resources>
<CompositeCollection x:Key="CompositeCollection">
<CollectionContainer Collection="{Binding Source={x:Reference stackPanel}, Path=DataContext.Movies}"/>
</CompositeCollection>
</ListBox.Resources>
<ListBox.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource CompositeCollection}}"/>
</CompositeCollection>
</ListBox.ItemsSource>

关于wpf - CompositeCollection : why can't I bind against the data context of another control but have to use a CollectionViewSource? 的来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25434059/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com