具有不同类型的多个来源的WPF ListBox [英] WPF ListBox with multiple sources of different types
问题描述
我实际上是为完全不同的示例设置示例应用程序,但是后来我尝试了这一点:
I was actually setting up a sample application for something entirely different, but then I was trying this:
我有一个Movies
的集合.我将有一个显示所有电影的列表框.但是,列表框将它们提供为按钮,因此您可以单击按钮来播放电影.
I have a collection of Movies
. I'll have a list box which displays all the movies. The list box, however, provides them as buttons, so that you can click onto a button and play the movie.
代码是:
<StackPanel DockPanel.Dock="Top">
<ListBox ItemsSource="{Binding Movies}" SelectedItem="{Binding Path=SelectedMovie}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True"
Width="{Binding (FrameworkElement.ActualWidth),
RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Title}"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},
Path=DataContext.PlayMovieCommand}"
CommandParameter="{Binding Id}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
然后我正在考虑在单个按钮的末尾添加文本添加",然后单击该按钮时,可以添加新电影.
Then I was thinking of adding a single Button to the end, with the text "Add", and when I click onto that button, I can add a new movie.
我找不到提供此解决方案.在搜索Internet时,我发现了HierarchicalDataTemplate
和CompositeCollection
.两者一开始看起来都很有前途,但是我没有让它按我的意愿工作.我也想到了MultiBinding
,但我似乎还是失败了.
I don't find a solution to provide this. While searching the Internet I found HierarchicalDataTemplate
and CompositeCollection
; both looking promising at first, but I failed to get it working as I want. I was thinking of MultiBinding
, too, but again I seem to fail.
所以,我想我的问题是:
如何将单个添加"按钮添加到我的电影收藏中?
So, I guess my question is:
How can I add a single Add-button to my collection of movies?
或更通用的: 如何将几个不同类型的数据源/集合添加到列表框中?
Or more generic: How can I add several sources/collections of data of different types to a list box?
推荐答案
对类型使用CompositeCollection
和DataTemplate
.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<XmlDataProvider x:Key="MoviesData" XPath="Movies/Movie">
<x:XData>
<Movies xmlns="">
<Movie Title="The Shawshank Redemption" />
<Movie Title="The Godfather" />
<Movie Title="The Dark Knight" />
</Movies>
</x:XData>
</XmlDataProvider>
<XmlDataProvider x:Key="MyButtonsData" XPath="MyButtons/MyButton">
<x:XData>
<MyButtons xmlns="">
<MyButton Title="Add Movie" />
</MyButtons>
</x:XData>
</XmlDataProvider>
<DataTemplate DataType="Movie">
<Button Content="{Binding XPath=@Title}"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},
Path=DataContext.PlayMovieCommand}"
CommandParameter="{Binding Id}" />
</DataTemplate>
<DataTemplate DataType="MyButton">
<Button Content="{Binding XPath=@Title}"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},
Path=DataContext.AddMovieCommand}" />
</DataTemplate>
</Page.Resources>
<ListBox>
<ListBox.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource MoviesData}}"/>
<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>
</Page>
这是Kaxaml
这篇关于具有不同类型的多个来源的WPF ListBox的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!