我尝试将我已经定义的收集TheCollection
与XAML定义的集合结合在一起GreekHeroesData
tocollectionwindow.xaml.vb:
Public Class ToCollectionWindow
Public myCollection As New ObservableCollection(Of Person)
Public ReadOnly Property TheCollection As ObservableCollection(Of Person)
Get
Return myCollection
End Get
End Property
Private Sub InitYo(sender As Object, e As EventArgs)
myCollection.Add(New Person("one"))
myCollection.Add(New Person("two"))
myCollection.Add(New Person("three"))
End Sub
End Class
tocollectionwindow.xaml
<Window ...
DataContext="{Binding RelativeSource={RelativeSource Self}}" />
<XmlDataProvider x:Key="GreekHeroesData" XPath="GreekHeroes/Hero">
<x:XData>
<GreekHeroes xmlns="">
<Hero Name="Jason" />
<Hero Name="Hercules" />
<Hero Name="Bellerophon" />
<Hero Name="Theseus" />
<Hero Name="Odysseus" />
<Hero Name="Perseus" />
</GreekHeroes>
</x:XData>
</XmlDataProvider>
...
这是我尝试的:
<DataTemplate DataType="{x:Type TheCollection}">
<TextBlock Foreground="Gold" Text="{Binding Path=Name}" />
</DataTemplate>
<DataTemplate DataType="Hero">
<TextBlock Foreground="Cyan" Text="{Binding XPath=@Name}" />
</DataTemplate>
<ListBox Width="200" IsSynchronizedWithCurrentItem="True">
<ListBox.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding TheCollection}" />
<CollectionContainer Collection="{Binding Source={StaticResource GreekHeroesData}}" />
<ListBoxItem Foreground="Red">Other Listbox Item 1</ListBoxItem>
<ListBoxItem Foreground="Red">Other Listbox Item 2</ListBoxItem>
</CompositeCollection>
</ListBox.ItemsSource>
</ListBox>
它的构建失败: The type reference cannot find a public type named 'TheCollection'.
TheCollection
包含 Person
对象。因此,DataTemplate
的DataType
应将其设置为Person
,即将应用于TheCollection
中的所有对象:
<DataTemplate DataType="{x:Type local:Person}">
<TextBlock Foreground="Gold" Text="{Binding Path=Name}" />
</DataTemplate>
正如我在评论中所写的那样,您必须在DataTemplate中指定该类型的XAML名称空间。就您而言,这是ObservableCollection(Of Person)
。真正的问题是,您无法在XAML中指定通用类型。
因此,您必须进行工作(对不起,VB语法,我确实在C#中发展(:
namespace YourViewModelNameSpace
{
using System.Collections.ObjectModel;
public class NonGenericPersonCollection : ObservableCollection<Person> { }
//Public Class NonGenericPersonCollection Inherits ObservableCollection(Of Person)
}
Public ReadOnly Property TheCollection As NonGenericPersonCollection
<Window ...
xmlns:vm="clr-namespace:YourViewModelNameSpace" />
<DataTemplate DataType="{x:Type vm:NonGenericPersonCollection}">