【发布时间】:2013-03-03 16:36:28
【问题描述】:
这是 MVVM + WPF,但实际上与这些工具没有太大关系。问题比较笼统,属于OO设计。
昨天 MarcinJuraszek 帮助我向original problem 提出了一个出色的解决方案。该解决方案解决了手头的问题,但现在我陷入了下一个层次。事情是这样的:
视图模型
我的 ViewModel 类继承自一个通用的抽象父 ViewModel 类:
Public MustInherit Class ViewModelBase
Implements INotifyPropertyChanged, IDisposable
...
End Class
具体的 ViewModel 如下所示:
Class SalesOrderEntryViewModel
Inherits ViewModelBase
Implements IEditorViewModel, IChildViewModel
...
End Class
IEditorViewModel 和 IChildViewModel 是我的一些具体 ViewModel 实现的接口。
观看次数
我所有的 View 类都实现了以下接口:
Interface IView(Of T As ViewModelBase)
WriteOnly Property MyVM As T
ReadOnly Property HeaderText As String
End Interface
基于我上面描述的SalesOrderEntryViewModel 的具体视图定义为:
Class SalesOrderEntryPage
Implements IView(Of SalesOrderEntryViewModel)
End Class
到目前为止一切顺利。我现在面临的实际问题是我想在应用程序级别创建所有打开的视图的强类型集合。这个集合的类型应该是什么?我尝试了类似以下的方法:
Dim Views As List(Of IView(Of ViewModelBase))
当我尝试将 SalesOrderEntryPage 类的对象添加到此列表时,它会引发运行时异常,告诉我它无法从 SalesOrderEntryPage 转换为 IView(Of ViewModelBase),尽管查看定义 SalesOrderEntryPage真的是IView(Of ViewModelBase)。
目前,VB.NET 正在帮助我解决后期绑定问题,但我想知道为什么会这样说,在这方面有什么优雅的解决方案?
【问题讨论】:
标签: vb.net generics mvvm interface casting