2016-05-26 6 views
0

JavaFx 8でプロジェクトを開発しました。ここで、あるタブから別のタブにデータを送信またはロードできます。今私はMVVパターンで同じプロジェクトを開発したいと思います。 これで、各タブとメインコントローラのビュー、ビューモデルとモデルを作成しました。これは他のタブを処理する必要があります。MVVMパターン(JavaFx 8)の別のタブにコントローラを介してタブからデータを送信/ロードする方法

Tab1

私はTAB1にし、TAB2にテキストを設定することができていますが、私はTAB2にTAB1からのデータを処理するために、メインコントローラモデル/モデルビューを構築する方法がわかりません。 mainconcontrollerviewをmaincontrollermodelにバインドしたい場合は、fxmlアノテーションのためにできません。

メインコントローラビューには、他の2つのビューが含まれています。私は私の問題は、あなたが多分見ている必要があり、車輪を再発明しようとしているの

MVVM TabTest link

答えて

1

を代わりにある可能性があり、私はこれまでとやっていることより良い理解を与えるためにクラスとFXML文書を提供しましたMVVMパターンを実装するフレームワークで、コンポーネント間の通信に必要な手段を提供します。

https://github.com/sialcasa/mvvmFX

0

1)MVVMについてあなたのコード内のいくつかの誤解があります。 MVVMの「表示」は、FXMLファイルと「CodeBehind」クラスの2つの要素で構成されています。 codeBehindクラスは、@FXMLアノテーションを持つUIコントロールへの参照を持つクラスです。次に、codeBehindクラスは、UIコントロールをViewModelのプロパティに接続します。したがって、あなたの "viewmodel"パッケージのクラスは、実際には "View"に属するcodeBehindクラスです。そして、あなたの "モデル"パッケージのクラスは実際にあなたの "ViewModels"です。

2)あなたの例では、各tabcodeBehindクラスにはmain codeBehindクラスへの参照があり、メインコードの後ろには各タブコードへの参照が含まれています。親コンポーネントの場合、子コンポーネントであることはわかりますが、子コンポーネントは、それらがどこでどのように使用されているかを知るべきではありません。

3)私はmvvmFXフレームワークの開発者の一人です。 mipaのように、このフレームワークは、このような状況のためにいくつかのヘルパーとユーティリティを提供しています。私はこれを行う2つの方法があると思う:

  1. dependency-injectionを使用する必要があります。 main viewModelでこのようにして、両方のtab viewModelへの参照を取得し、codeBehindクラスが互いに知り合うことなくそれらを接続することができます。
  2. フレームワークの最後のバージョンでは、「スコープ」と呼ばれるベータ機能を導入しました。基本的に、いくつかのviewModelで使用されるデータを保持するためにインデントされたクラスです。 ViewModelsはスコープインスタンスを挿入し、このデータを使用することができます(例:データバインディング経由)。このように、ViewModelは他のViewModelを直接知る必要はなく、Scopeインスタンスのみを認識します。後で新しいタブを追加すると、既存のクラスを変更する必要はありません。詳細はhereです。
関連する問題