“在使用ItemsSource之前,项目集合必须为空。”

.net binding entity-framework vb.net wpf

我正在尝试将图像显示在WPF ListView中,其风格类似于WrapPanel,如旧的ATC Avalon团队文章中所述: 如何创建自定义视图

WPF ListView WrapPanel图像

当我尝试使用LINQ-to-Entities查询的ADO.NET Entity Framework对象集合填充ListView时,我得到以下异常:

例外

在使用ItemsSource之前,项集合必须为空。

我的代码......

Visual Basic

Private Sub Window1_Loaded(...) Handles MyBase.Loaded
    ListViewImages.ItemsSource = From g In db.Graphic _
                                 Order By g.DateAdded Ascending _
                                 Select g
End Sub

XAML

<ListView Name="ListViewImages"
          SelectionMode="Single"
          ItemsSource="{Binding}">
    <local:ImageView />
</ListView>

我在那条线上放了一个断点。 ListViewImages.ItemsSource在LINQ赋值之前是Nothing

一般承认的答案

抛出此特定异常的原因是元素的内容应用于ListView的Items集合。因此,XAML在其Items集合中使用单个本地:ImageView初始化ListView。但是当使用ItemsControl时,您必须使用Items属性或ItemsSource属性,不能同时使用它们。因此,当处理ItemsSource属性时,将引发异常。

您可以通过查找类中的ContentPropertyAttribute来找出元素内容将应用于哪个属性。在这种情况下,它在类层次结构中的ItemsControl上定义得更高:

[ContentPropertyAttribute("Items")]

这里的意图是将ListView的View设置为local:ImageView,因此修复是明确指示要设置的属性。

修复XAML,异常消失:

<ListView Name="ListViewImages"
          SelectionMode="Single"
          ItemsSource="{Binding}">
    <ListView.View>
        <local:ImageView />
    </ListView.View>
</ListView>

它缺少<ListView.View>标签。


热门答案

在一个稍微不同的场景中,我有一段时间出现同样的错误。我有

<wpftoolkit:DataGrid
    AutoGenerateColumns="False"
    ItemsSource="{Binding Path=Accounts}" >
    <wpftoolkit:DataGridTextColumn 
        Header="Account Name" 
        Binding="{Binding Path=AccountName}" />
</wpftoolkit:DataGrid>

我固定的是

<wpftoolkit:DataGrid
    AutoGenerateColumns="False"
    ItemsSource="{Binding Path=Accounts}" >
    <wpftoolkit:DataGrid.Columns>
        <wpftoolkit:DataGridTextColumn 
            Header="Account Name" 
            Binding="{Binding Path=AccountName}" />
    </wpftoolkit:DataGrid.Columns>
</wpftoolkit:DataGrid>



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因