問題タブ [simple-mvvm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
wpf - ビューが階層的で、スワップインとスワップアウトが必要な場合に ViewModel を見つけるための戦略
車のナビゲーションシステムを構築しているとしましょう:
- メイン ウィンドウには、画面、モード ボタン、およびボリューム コントロールが含まれます。
- システムのモードに応じて、画面にはオーディオ、気候、またはナビゲーション パネルが表示されます。
- オーディオ モードのときは、別のモード ボタン セットと、ラジオ、CD、または MP3 コントロールのいずれかを表示できるパネルがあります。
これまでのこのような配置に対する私の戦略は、ビュー モデルがビューとまったく同じ階層に従うようにすることでした。そう:
- MainViewModel には ScreenViewModel があります。
- ScreenViewModel には、AudioViewModel、ClimateViewModel、および NavigationViewModel があります。システム モードに応じて、オーディオ、気候、またはナビゲーション ビュー モデルのいずれかに設定される CurrentViewModel プロパティも含まれます。
- AudioViewModel は ScreenViewModel に似ており、オーディオ システムの各モード (ラジオ、CD、および MP3) のビュー モデルと、現在のモードのビュー モデルを格納するためのプロパティを保持します。
ビューをビュー モデルにバインドするための XAML は次のようになります。
ユーザーがラジオを聞いていて、ナビゲーション システムに目的地を入力することにした場合、ユーザーは [ナビゲーション モード] ボタンをクリックします。システム モードを「Navigation」に変更し、CurrentViewModel を NavigationViewModel に設定する MainWindowViewModel のコマンドがあります。これにより、NavigationView がスワップインされます。非常にクリーンなソリューションです。
残念ながら、この方法は実行モードではうまく機能しますが、Expression Blend で下位ビュー (AudioPanel など) を操作しようとするとうまくいきません。これは、AudioViewModel を提供する親ビュー モデル (MainWindowViewModel) が存在しないためです。
MVVM Light や Simple MVVM などのツールキットでサポートされていると思われる解決策は、代わりに ViewModelLocator を使用し、ロケーターの正しいプロパティにバインドしてビューを独自の DataContext に設定することです。次に、ロケーターはビュー モデルのインスタンスを提供します。
「ViewModelLocator のやり方」は「デザイン性」の問題を解決しますが、階層関係をどのように表現し、あるビューから別のビューへの交換を処理するかは明確ではありません。概念的には、ビュー モデルに子ビュー モデルを保持させる方が理にかなっています。ビューの階層を正しく表現し、ビューの交換は簡単です。ビューが不要になった場合、関連するビュー モデルとそのすべての下位モデルは、親への参照を削除するだけでガベージ コレクションされます。
質問
ViewModelLocator を設計して、階層ビュー、システム モードに基づくビューのスワップ インとアウト、およびビューの削除を処理するためのベスト プラクティスは何ですか?
具体的には:
- 階層関係が明確に表現されるように、ビュー モデルをどのように編成しますか?
- ある既存のビューを別のビューに交換する方法 (オーディオ パネルをナビゲーション パネルに置き換えるなど) を処理するにはどうすればよいですか?
- 関連する親ビューが不要になったときに、親ビュー モデルと子ビュー モデルがガベージ コレクションのために解放されるようにするにはどうすればよいでしょうか?
data-binding - コンボボックスの選択された値のバインディングが双方向データバインディングに逆流しない
シンプルなMVVMフレームワークを使用してシンプルなSilverlight4.0LOBアプリケーションを作成します。
のすべての従業員のリストを表示する従業員リストビューがあり、EmployeeListViewModelに次のようないくつかのプロパティがあります。
これで、私のビューには、従業員リストで選択した従業員を編集するためのボタンがあり、編集するEmployeeDetailsを含む新しい子ウィンドウが開きます。
これが従業員の編集方法です
今私の詳細にチャイルドビュー私はこの請負業者を持っています
これが私のDetailsViewModel請負業者です
結局、これでバインディングができました。部門、宗教、学年用の3つのコンボボックスがあります(これは私の従業員テーブルの外部キーです)
など..問題は、値を変更したときに、Departmentsコンボボックスのみがソース値を更新していることです。
バインディングステートメントがまったく同じであっても、他のコンボボックスは..しません!!
たくさん書いたことをお詫びします..しかし、誰かがこれで私を助けることができますか?
どうもありがとう
java - Java の MVVM パターン
mvvm
Javaでプロジェクトを作りたいです。しかし、サンプルプロジェクトが見つかりません。いくつかの Android サンプルがありますが、Android プロジェクトを作成したくありません。mvvm
では、パターンを使用してプロジェクトを作成するにはどうすればよいですか?
コンボ ボックスとデータ グリッドがあるデスクトップ アプリケーションを作成しようとしています。アプリはデータベース (MySQL など) に接続する必要があり、データ グリッドにはデータが入力されている必要があります。コンボ ボックスを変更すると、グリッドのコンテンツも変更される必要があります。CRUD
多分私は後のステップで - 操作 をしたいです。
だから何か提案...
wpf - MVVMユニットテスト-メッセージバスは1回だけ機能します
SimpleMvvmToolkitを使用してビューモデルに対していくつかの単体テストを作成しようとしています。これらのテストのいくつかでは、ビューモデル内でイベントを発生させるためにメッセージをメッセージバスに送信する必要があります。問題は、メッセージバスを「使用」できるのは1回だけのように見えることです。メッセージを送信する最初のテストは成功しますが、メッセージを送信する他の2つのテストは失敗します。しかし、各テストを個別に実行すると、3つすべてが合格し、順序を変更すると、最初のテストは、どちらであっても合格します。
これは、テストの1つのサンプルです。
そのため、サービスのモック(WCFサービスのラッパー)を作成し、サービスのDeleteValidatonRequestが呼び出されていることを確認しています。この場合、ユーザーが[OK]をクリックすると、通常は確認ダイアログがポップアップしてDeleteValidationRequestConfirmationメッセージを送信するため、メッセージバスが必要です。
テストは最後の行(検証)で失敗し、デバッグすると、ビューモデルのメッセージのハンドラーが実行されないため、メッセージが実際に送信されないように見えます。繰り返しますが、これは、テストがバスにメッセージを送信する最初のテストではない場合にのみ失敗します。単独で実行するか、最初に実行する場合、テストは合格です。
何か案は?すべてのテストは独立しており、テストクラスのプロパティや変数を共有していないため、どのように相互にステップできるかわかりません。
編集:リフレクションを使用して、メッセージが通常起動するビューモデルの保護されたメソッドを呼び出しました。これにより、必要なコードカバレッジが得られますが、ビューモデルがメッセージに正しく応答していることを確認できません。
編集2:クラップ、ビューモデルのPropertyChangedイベントでも同じことが起こっています。イベントハンドラーは、テストが独立して実行されるか、最初の場合にのみ起動します。
c# - プロパティセッターがMVVMパターンで副作用を起こすことは問題ありませんか
標準的な問題を解決することを目的としたWPFアプリを作成しています。私はWPFとMVVMのパターンに本当に慣れていないので、インターネットでMVVMへのさまざまなアプローチをたくさん読んだ後、頭の中で少し混乱しています。DataGridのitemsource更新操作の簡単な操作がMVVMにとってどのように「慣用的」であるかを知りたいです。
1つのデータグリッドと1つのコンボボックスがあるとしましょう。コンボには、すべてのコーチのリストが含まれています。データグリッドには、選択したコーチによってトレーニングされたすべてのスポーツマンが表示されるため、コンボはデータグリッド内のデータのフィルターのように機能します。
私のViewModelクラスは、SelectedCoachプロパティのセッターでDataGridのコンテンツを変更します(このプロパティはComboboxの値のターゲットです):
そのようなコードは臭いがしませんか?または、SelectedCoachプロパティの変更をサブスクライブし、ListSportsmanを別の関数に設定する方が適切ですか?(ちなみに、NotifyPropertyChangedイベントを手動でサブスクライブする方法は?)
wpf - WPF - SimpleMVVM メッセージバスによって実行されるコードで例外をキャッチする
SimpleMVVM フレームワークを使用して WPF アプリケーションを構築していますが、例外をキャッチできません。SimpleMVVM の MessageBus を使用して、別のビューモデルにメッセージを送信します。これはすべて正常に動作しますが、メッセージバスによって実行されるコードで発生した例外が抑制されることに気付きました。ここに私がこれまでに持っているものがあります:
Myには、MainWindowViewModelMainWindow
で起動するボタンが含まれていますTempCommand
。このコマンドはTest
、SimpleMVVM の MessageBus を使用して通知メッセージを送信するメソッド (以下に示す) を呼び出します。
MyMainWindow
にもFrame
with コンテンツが含まれています。このコンテンツの ViewModel はCustomerViewModel
、コンストラクターでこれらの通知を受け取るように登録されています。
Temp
メソッドが単純に例外をスローする場合:
Temp
アプリケーションをデバッグすると、メソッドが呼び出され、例外が発生していることがはっきりとわかります。でもなぜかそれだけ。アプリケーションは影響を受けず、例外トラップ コードは例外を認識しません。
2 つの方法で例外をトラップします。1 つ目は、次のイベントを処理することDispatcher
です。
コード ビハインドは次のようになります。
このコードはいくつかの例外をキャッチしますが、すべてではありません。WPF はデフォルトでデータバインディングの例外を抑制することがわかりました。ViewModels はDataContext
ビューのプロパティを介してバインドされているため、これが問題だと思いました。クラスを使用するを定義するこの記事を見つけました。データバインディングの例外がキャッチされるようになりましたが、MessageBus を介して実行されるコードでスローされた例外ではありません。TraceListener
PresentationTraceSources
この動作を示すソリューションを作成しました。ここからダウンロードできます。
そして、これは私が立ち往生しているところです。私は何が欠けていますか?これらの例外をキャッチするにはどうすればよいですか?
よろしくお願いします。
JP
windows-phone-7 - MVVM コード ビハインド イベントから逃れる方法
いくつかの MVVM ツールキット (MVVM Light、SimpleMVVM) を見た後、共通のテーマは、コードビハインドを使用せずに、できるだけ多くのブレンド可能なイベントを使用しようとしているようです。
すべてのイベントを行う方法がわかりません。たとえば、windows phone 7 を実行すると、2 つのイベントがバインドされます。
- OnNavigatedTo/From
- ロード中
MVVMでこれを行う方法の例はありますか? 私はSimpleMVVMを使用していますが、例が似ていて、MVVMライトツールキットや、これを示す一般的なMVVMチュートリアルが役立つことを願っています.
ボタンのクリックのようにする方法を示すものしか見つかりませんでした。
編集
コード ビハインド イベントをいつ使用するか、ブレンド イベントをコマンドに使用するかについて、私はちょっと混乱しています。
たとえば、MVVM Light チュートリアルでは、ナビゲーションに MVVM を使用していますが、分離コード イベントを使用するよりも優れているのはなぜですか?
人々が言うとき、私も今ちょっと混乱しています
コードビハインドは悪ではありません。ビジネス ロジックとコード ビハインドの組み合わせが問題です。UI がコード ビハインドで UI タスクを処理できるようにします。
MVVMライトの例では、例の1つに「isbusy」があり、リストまたはそれが何であれ(忘れた)ロード中に「ロードサインが表示されます」。これはすべて、コード ビハインド イベントではなく、ViewModel で行われました。
だから、これは私にはちょっと矛盾しているようです(何かが足りないかもしれません)。また、私が困惑しているのは、ViewModel が読み込みについて何も知らない場合、読み込みがいつ開始または終了したかをどのように知ることができるかということです。
wpf - DevExpress および SimpleMvvmToolkit - シリアル化エラー
ビューモデルの ObservableCollection にバインドされた DevExpress DxGrid があります (SimpleMvvmToolkit に基づく)。ビューモデルには、それ自体によって公開される 2 つのプロパティ (文字列とブール値) があり、他のいくつかのプロパティはその基本クラス (ViewModelDetailBase) によって公開されます。そのうちの 1 つはビューモデルの背後にあるモデルです。
グリッドを使用していずれかのプロパティ (ブール値など) の内容を変更するたびに、「型 xxx をシリアル化できません..」というエラーが表示されます (xxx はモデルの型です)。この問題を回避するには、DataContractAttribute を使用してください。解決策を探す方法と場所がわかりません。多分私はそれを読む必要がありますが、なぜシリアル化がここで必要なのですか??
とにかく、これに光を当てていただければ幸いです。正しい方向に向けるためのいくつかの指針をいただければ幸いです。
編集:状況が複雑すぎて関連するコードをここに投稿できないため、エラーを再現するサンドボックス プロジェクトを作成しました。この WeTransfer リンクから見つけることができます。
よろしく、〜ロブ
c# - ビューモデルを介してモデルの入力検証を伝播する方法はありますか
いくつかのプロパティを持つモデルがあり、そのモデルでいくつかの検証チェックを行います (値が範囲を超えていないかどうか、数値であるかどうか、有効な郵便番号であるかどうかなど)。これらのチェックはモデルが行うべきだと思います。
これらの検証インターフェイスのいずれかを使用する選択肢があります:INotifyDataErrorInfo
またはIDataErrorInfo
. 好みはありません。
IsSelected 、 IsInScope、IsSaved などのいくつかの追加のビュー固有のハウスキーピング プロパティとともに、モデルのプロパティの多くを公開するビューモデルがあります。
ビュー(この場合は DevExpress の DxGrid) はビューモデルのコレクションにバインドされているため、モデルの検証チェックが隠されています (ビューモデルのインターフェイスにバインドされています) 。モデルの検証チェックをビューに伝達し、ビューモデルを介して伝達する簡単な方法はありますか?
編集:fyi、私は Simple MVVM Toolkit を使用しています。これは INotifyDataErrorInfo を Model 基本クラスに組み込みましたが、Viewmodel 基本クラスには組み込みませんでした。