這是MVVM + WPF,但實際上與這些工具沒有多大關係。問題更通用,屬於面向對象的設計。爲什麼不能將IView(Of SpecificViewModel)投影到IView(Of ViewModelBase)?
昨天MarcinJuraszek幫我提出了一個很好的解決方案original problem。該解決方案解決了問題,但現在我陷入了下一個層面。這是怎麼一回事呢:
的ViewModels
我的視圖模型類,從一個共同的抽象父ViewModel類繼承:
Public MustInherit Class ViewModelBase
Implements INotifyPropertyChanged, IDisposable
...
End Class
混凝土的ViewModels是這樣的:
Class SalesOrderEntryViewModel
Inherits ViewModelBase
Implements IEditorViewModel, IChildViewModel
...
End Class
IEditorViewModel
和IChildViewModel
是我的一些具體ViewModel實現的接口。
查看
我所有的視圖類實現以下接口:
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正在幫我解決後期綁定問題,但我想知道爲什麼它這麼說,以及這方面的優雅解決方案是什麼?
感謝您的詳細解釋。問題是我的泛型參數被用來在我的ViewModel類中定義一個屬性(Get和Set),所以從我從你的答案中理解的是,我同時需要同時和反變量行爲,據我瞭解是不可能的。爲此我最終做了反思。很快就會發布。但這絕對是一般情況下的正確答案。 – dotNET 2013-03-15 13:11:43