1)MVVMについてあなたのコード内のいくつかの誤解があります。 MVVMの「表示」は、FXMLファイルと「CodeBehind」クラスの2つの要素で構成されています。 codeBehindクラスは、@FXMLアノテーションを持つUIコントロールへの参照を持つクラスです。次に、codeBehindクラスは、UIコントロールをViewModelのプロパティに接続します。したがって、あなたの "viewmodel"パッケージのクラスは、実際には "View"に属するcodeBehindクラスです。そして、あなたの "モデル"パッケージのクラスは実際にあなたの "ViewModels"です。
2)あなたの例では、各tabcodeBehindクラスにはmain codeBehindクラスへの参照があり、メインコードの後ろには各タブコードへの参照が含まれています。親コンポーネントの場合、子コンポーネントであることはわかりますが、子コンポーネントは、それらがどこでどのように使用されているかを知るべきではありません。
3)私はmvvmFXフレームワークの開発者の一人です。 mipaのように、このフレームワークは、このような状況のためにいくつかのヘルパーとユーティリティを提供しています。私はこれを行う2つの方法があると思う:
- dependency-injectionを使用する必要があります。 main viewModelでこのようにして、両方のtab viewModelへの参照を取得し、codeBehindクラスが互いに知り合うことなくそれらを接続することができます。
- フレームワークの最後のバージョンでは、「スコープ」と呼ばれるベータ機能を導入しました。基本的に、いくつかのviewModelで使用されるデータを保持するためにインデントされたクラスです。 ViewModelsはスコープインスタンスを挿入し、このデータを使用することができます(例:データバインディング経由)。このように、ViewModelは他のViewModelを直接知る必要はなく、Scopeインスタンスのみを認識します。後で新しいタブを追加すると、既存のクラスを変更する必要はありません。詳細はhereです。