如何解决从WPF中的Collection <Derived>绑定到Collection <Base>
我有一个ListView
,它被多次使用,每种情况都需要显示同一抽象类的不同派生类的项。我想搜索列表并从列表中删除项目。不用说,如果我可以绑定到基类并将其封装在UserControl
中,那将很方便。
具体来说,抽象类
Public MustInherit Class SearchableItem
Public ReadOnly Property Text As String
End Class
和派生的人
Public Class Series
Inherits SearchableItem
Public Property Title As String
Public Property Desc As String
Public Overloads ReadOnly Property Text As String
Get
Return Title
End Get
End Property
End Class
这显示在
Public Class SomeAvatar
Public Property SeriesList As New ObservableCollection(Of Series)
End Class
最后,UserControl
具有ItemList
显示的依赖项属性ListView
。
Public Property ItemList As ObservableCollection(Of SearchableItem)
Get
Return GetValue(ItemListProperty)
End Get
Set(ByVal value As ObservableCollection(Of SearchableItem))
SetValue(ItemListProperty,value)
End Set
End Property
Public Shared ReadOnly ItemListProperty As DependencyProperty =
DependencyProperty.Register("ItemList",GetType(ObservableCollection(Of SearchableItem)),GetType(ucListView),New PropertyMetadata(nothing))
问题是ItemList
为空。我已经检查了UserControl
的所有父项的Loaded事件,它们都具有完整的集合。然后,我将集合作为DataContext
的{{1}}的一部分通过,并得到了一个错误,内容为UserControl
(释义)。
不是狗的集合,也不是动物的集合吗?我必须缺少一些基本的东西,或者这与WPF有关?
解决方法
This answer(一个非常类似的问题)解释了为什么不允许这样做。
简短的答案是,您不能将Series
的可写集合视为SearchableItem
的可写集合,因为应该允许SearchableItem
的集合包含任何派生的对象来自SearchableItem
,而Series
的集合应该仅只能包含Series
个对象。
简短的答案是,您可以像读ObservableCollection<Series>
一样读ObservableCollection<SearchableItem>
,但是不能这样写。
如果ItemList
只需要从集合中读取,则可以使用IEnumerable<SearchableItem>
,您将分配值ObservableCollection<Series>
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。