序章
実行中にラボ機器データをインポートするアプリケーションがあります。このデータはインポートListView
され、エンドユーザーがテスト要件に従って設定した間隔で表示されます。監視対象の値が表示されたらListView
、[開始] ボタンを押します。アプリケーションは、[停止] ボタンが押されるまで、そのデータと後続のデータの計算を開始します。したがって、画面の左側にはインポートされたデータを表示するためのビューがあり、右側には計算および表示される値と統計を監視するための別のビューがあります。
現在のコード
データのインポート先の ListView を表示するビューは ImportProcessView.xaml であり、それを に設定しDataContext
ますImportProcessViewModel.cs
。先ほど紹介した VM には、ObservableCollection<IrData>
先ほど説明した ListView がバインドするプロパティがあります。さて、興味深い部分に...
にImportProcessView
は、ContentControl
コンテンツを動的に設定する UserControl があり、エンド ユーザーが選択した Phase のタイプに固有のコントロールとフィールドを表します。
<StackPanel Background="White" Margin="5">
<ContentControl Content="{Binding CurrentPhaseView}"/>
</StackPanel>
3 つの がありPhaseViews
、それぞれが独自のユーザー コントロールにあり、それぞれが に設定さDataContext
れていImportProcessViewModel
ます。その結果、VM が 2000 行にまで膨れ上がりました。ばかげている。知っている。肥大化の理由は、ImporProcessViewModel
が 3 つの PhaseView のそれぞれのプロパティを通じて状態を維持しているだけでなく、データがこれらの「PhaseView」に保存および表示される計算を実行するためのメソッドが含まれているためです。
私が達成しようとしていること
明らかにImportProcessViewModel
扱いにくくなる前に、各 PhaseView が独自の ViewModel を持つように分割する必要がありますが、各 ViewModel が ImportProcessViewModel との関係を維持して、ObservableCollection によって課せられる依存関係を維持できるようにする必要がありIrData
ます。
研究開発
相互に通信する ViewModel について調査しましたが、ほとんどの結果には、特定の MVVM フレームワークで作成されたアプリケーションが含まれています。私はフレームワークを使用していません。プロジェクトのこの時点では、フレームワークを使用するためにリファクタリングするには遅すぎます。
しかし、私はこの記事を見つけました.「hbarck」が提供する答えは、私が望む結果を達成するための構成のような単純なものを示唆していますが、私はDataTemplatesの経験があまりないので、彼/彼女は、「UserControl の ViewModel をメインの ViewModel のプロパティとして公開し、ContentControl をこのプロパティにバインドして、DataTemplate を介して View (つまり UserControl) をインスタンス化する」ことを提案しています。
具体的には、 「ContentControl をこのプロパティにバインドし、DataTemplate を介してビューをインスタンス化する」という意味がわかりません。
この例のコンテキストで DataTemplate を介してビューをインスタンス化することの意味を、コード例を使用して誰かが明確にすることはできますか?
さらに、これは良いアプローチですか (「hbarck」で提案されているように)?
ご覧のとおり、ContentControl の Content プロパティを、インスタンス化するフェーズ ビューに既に設定しています。DataTemplate がどのように見えるかはわかりません。