我正在尝试让图像显示在样式类似于 WrapPanel 的 WPF ListView 中,如这篇旧的 ATC Avalon 团队文章中所述:如何创建自定义视图。
当我尝试使用 LINQ-to-Entities 查询的 ADO.NET 实体框架对象集合填充 ListView 时,出现以下异常:
Exception
使用 ItemsSource 之前,Items 集合必须为空。
我的代码…
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
是Nothing
就在 LINQ 分配之前。
答案
引发此特定异常的原因是元素的内容被应用到 ListView 的 Items 集合。local:ImageView
在其Items
收集。Items
财产或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>
标签。