これは MVVM + WPF ですが、これらのツールとはあまり関係がありません。問題はより一般的で、OO 設計に属します。
昨日、MarcinJuraszek が元の問題に対する優れた解決策を提案してくれました。その解決策は当面の問題を解決しましたが、今は次のレベルで立ち往生しています。手順は次のとおりです。
ビューモデル
私の 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
上記の I に基づく具体的な View は、次のように定義されます。
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 は遅延バインディングで私を助けてくれていますが、なぜそう言っているのか、また、この点に関してエレガントな解決策は何なのか疑問に思っています。