WPF-如何在窗口的代码范围内访问公共字段的类型



我尝试将我已经定义的收集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对象。因此,DataTemplateDataType应将其设置为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}">

最新更新