問題タブ [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.

0 投票する
4 に答える
2241 参照

wpf - MV-VM - ViewModel でコマンドを使用する例はありますか?

私は、MV-MC (Model-View-ModelController) と呼んでいる MV-VM のフレーバーを使用して、非常に大きな LOB アプリを開発してきました。これは、MVC と MV-VM の一種の組み合わせです。MV-VM でビューがどのようにインスタンス化されるかに関するこの回答を、「 wpf 開発で最も一般的な間違いは何ですか」という質問に投稿しました。

サムは私の答えに関して次のコメントをしました:

これにより、フォローアップの質問が作成されます。ビューをどのように作成しますか? RelayCommands を使用してアクションをビューから ViewModel にバインドするため、ビューはアクションが発生したことさえ認識せず、新しいビューを開く必要があることも認識しません。解決策: ビューがサブスクライブするためのイベントを VM に作成しますか?

私が最初に MV-VM の開発を始めたとき、私はすべてが ViewModel に存在するべきであるという考えを持っており、Josh SmithKarl Shifflettのような人々から多くの例を研究しました。ただし、コマンドが ViewModel に存在する必要がある場合の良い例をまだ見つけていません。

たとえば、顧客を表示する ListView と、現在選択されている顧客を編集するためにクリックするボタンがあるとします。ListView (View) は CustomerVM (ViewModel) にバインドされます。ボタンをクリックすると、EditCustomerCommand が起動され、CustomerVM のすべてのプロパティを編集できるポップアップ ウィンドウが開きます。この EditCustomerCommand はどこにありますか? ウィンドウを開く必要がある場合 (UI 機能)、ビューのコード ビハインドで定義すべきではありませんか? 代替テキスト

ビューとビューモデルでコマンドを定義する必要がある場合の例はありますか?

マシュー・ライトは次のように述べています。

リストからの新規作成と削除が良い例です。そのような場合、空のレコードが追加されるか、ViewModel によって現在のレコードが削除されます。ビューによって実行されるアクションは、発生したイベントに応答する必要があります。

新しいボタンをクリックするとどうなりますか? CustomerVM の新しいインスタンスは、親 ViewModel によって作成され、そのコレクションに追加されますか? では、どのようにして私の編集画面が開かれるのでしょうか? ビューは Customer ViewModel の新しいインスタンスを作成し、それを ParentVM.Add(newlyCreatedVM) メソッドに渡す必要がありますか?

VM 上にある DeleteCommand を使用して顧客レコードを削除するとします。VM はビジネス レイヤーを呼び出し、レコードの削除を試みます。できないので、VM にメッセージを返します。このメッセージをダイアログボックスに表示したい。ビューはどのようにしてコマンド アクションからメッセージを取得しますか?

0 投票する
9 に答える
20034 参照

wpf - WPF MV-VM:ListCollectionViewから選択したアイテムを取得しますか?

Model-View-ViewModel パターンを使用した WPF アプリを作成しました。
私のViewModelには、アイテムのリストを保持するためのListCollectionViewがあります。
この ListCollectionView は、ビューの ListBox にバインドされています。

ListBox には SelectionMode=Multiple があるため、一度に複数の項目を選択できます。ここで、ViewModel はどの項目が選択されているかを知る必要があります。

問題は、View-Model-ViewModel パターンでは ViewModel が View にアクセスできないため、どの項目が選択されているかを ListBox に問い合わせることができないことです。私が持っているのは ListCollectionView だけですが、そこで選択されているアイテムを見つける方法が見つかりません。

では、ListBox で選択されている項目を見つけるにはどうすればよいでしょうか。または、これを達成するためのトリック (おそらく、何かをブール値の 'IsSelected' アイテムにバインドしますか?しかし、何を?どのように?)

たぶん、このパターンを使用している人もここで私を助けることができますか?

0 投票する
23 に答える
125156 参照

.net - MVVM を使用した WPF でのダイアログの処理

WPF の MVVM パターンでは、ダイアログの処理はより複雑な操作の 1 つです。ビューモデルはビューについて何も知らないため、ダイアログ通信は興味深いものになる可能性があります。ICommandビューがそれを呼び出すと、ダイアログが表示されることを公開できます。

ダイアログからの結果を処理する良い方法を知っている人はいますか? などの Windows ダイアログについて話していますMessageBox

これを行った方法の 1 つは、ダイアログが必要なときにビューがサブスクライブするイベントをビューモデルに設定することでした。

これは問題ありませんが、ビューには避けたいコードが必要であることを意味します。

0 投票する
1 に答える
901 参照

silverlight - Silverlightと複数のビューモデル

MVVMパターンを使用してSilverlightアプリを作成しています。メインビュー(UserList.xaml)と対応するvm(UserListViewModel.cs)があります。これは、ユーザーのコレクションを一覧表示するために使用されます。また、新しいユーザーの詳細を追加するために使用されるUserControl(User.xaml-モーダルダイアログとして呼び出されます)もあります。これには、独自のビューモデル(UserViewModel.cs)もあります。

私の質問は、子ビューが閉じられた後、子ビューモデルから親に情報(ユーザーオブジェクト)をどのように渡すかです。子ビューモデルで保存を行うときに、親ビューモデルのコレクションを更新する必要があります。十分に単純である必要がありますが、親のビューモデルは子がいつ解雇されるかわかりません。UserViewModel.Userプロパティが変更され、そのPropertyChangedイベントが発生した場合でも、UserListViewModelはそれを認識しません。

ここでの助けは大歓迎です。私はSilverlightのmvvmについてすべて読んだことがありますが、まだいくつかのギャップがあります。問題の概要を明確に説明できたと思います。

0 投票する
2 に答える
4512 参照

.net - ICommand インターフェイス、MVVM の実装と使用

私は MVVM パターンに深く恋をしましたが、(まだ) 自分で理解できない問題がたくさんあるようです。

IComamnd インターフェイスのメソッドのパラメーターは何に適しているのだろうか

例えばvoid Execute(object parameter);

このようにビューをビューモデルに結び付けます

そのため、" parameter" は常に null になります。

どんなヒントでも大歓迎です。

ありがとう!

更新:くそー、この質問を投稿してから 1 分後、 Stackoverflow で答えを見つけました。明らかに、コントロールには CommandParameter プロパティがあります。

0 投票する
25 に答える
111170 参照

c# - ViewModel はどのようにフォームを閉じる必要がありますか?

私は WPF と MVVM の問題を学習しようとしていますが、問題が発生しました。この質問は似ていますが、これとまったく同じではありません(handling-dialogs-in-wpf-with-mvvm) ...

MVVM パターンを使用して記述された「ログイン」フォームがあります。

このフォームには、通常のデータ バインディングを使用して XAML でビューにバインドされているユーザー名とパスワードを保持する ViewModel があります。また、通常のデータバインディングを使用して、フォームの「ログイン」ボタンにバインドされた「ログイン」コマンドもあります。

「Login」コマンドが起動すると、ViewModel 内の関数が呼び出され、ネットワーク経由でデータが送信されてログインされます。この関数が完了すると、次の 2 つのアクションが実行されます。

  1. ログインが無効でした - MessageBox を表示するだけで問題ありません

  2. ログインは有効でした。ログイン フォームを閉じて、true を返す必要がありDialogResultます。

問題は、ViewModel が実際のビューについて何も知らないことです。そのため、ビューを閉じて、特定の DialogResult を返すように指示するにはどうすればよいでしょうか?? CodeBehind にいくつかのコードを貼り付けたり、View を ViewModel に渡したりすることもできますが、それは MVVM のポイント全体を完全に無効にするようです...


アップデート

結局、私はMVVMパターンの「純度」に違反し、ビューにClosedイベントを発行させ、Closeメソッドを公開させました。ViewModel は を呼び出すだけview.Closeです。ビューはインターフェイスを介してのみ認識され、IOC コンテナーを介して接続されるため、テスト容易性や保守性が失われることはありません。

受け入れられた回答が-5票であることは、かなりばかげているようです! 「純粋」でありながら問題を解決することで得られる気持ちの良さはよく知っていますが、1 行のメソッドを回避するためだけに 200 行のイベント、コマンド、および動作が必要だと考えるのは私だけではありません。 「パターン」と「純度」の名前は少しばかげています....

0 投票する
8 に答える
7267 参照

wpf - System.Windows.Input.ICommand を使用せずに WPF に MVVM を実装する

MVVM (Model-View-ViewModel) パターンを使用して WPF アプリケーションを実装しようとしていますが、View パーツを Model および ViewModel パーツ (DLL) とは別のアセンブリ (EXE) に配置したいと考えています。

ここでのひねりは、Model/ViewModel アセンブリを WPF の依存関係から切り離すことです。この理由は、Mono での WinForms や GTK# など、異なる (WPF 以外の) UI 技術を持つ実行可能ファイルから再利用したいからです。

ViewModel は 1 つ以上の ICommand を公開するため、既定では、これは実行できません。しかし、ICommand 型は、WPF に属する System.Windows.Input 名前空間で定義されています。

では、ICommand を使用せずに WPF バインディング メカニズムを満たす方法はありますか?

ありがとう!

0 投票する
4 に答える
1744 参照

wpf - MVVMパターンでモデルとビューモデル間の一貫性を維持するにはどうすればよいですか?

問題文

構成ファイルの内容を変更するための非常に基本的な WPF アプリケーションを作成しています。データ形式は、スキーマを含む XML ファイルです。MVVMの学習プロジェクトとして使用したいので、コードを適切に分割しました

  • モデル: xsd.exe から自動生成された C# クラス

  • View-Model : モデルの表示しやすい表現。

  • 表示: Xaml と空のコード ビハインド

View-Model が View-binding を簡単にする方法を理解しています。しかし、それでは View-Model <-> Model のセマンティクスが非常にぎこちなくなりませんか? Xsd.exe は、複数の XML 要素の配列を持つ C# クラスを生成します。ただし、V-VM レベルでは監視可能なコレクションが必要です。

質問:

これは、同じデータを表す 2 つのまったく異なるコレクション タイプを一貫して保持しなければならないということでしょうか?

モデルとビューモデルの間の一貫性を維持するためのベスト プラクティスは何ですか?

0 投票する
2 に答える
804 参照

wpf - ボタンの CommandParam で特定のビューモデル オブジェクトを渡すにはどうすればよいですか?

マスター/ディテール UI パターンを使用する単純な WPF プログラムがあります。詳細には、マスター ペインでコレクションの現在選択されている項目が表示されます。私はMVVMを使用しています。各XAMLページは、DataContextとして設定されたViewModelオブジェクトによって支えられています。

ここで、マスター ペインに [削除] ボタンを追加して、アイテムのマスター リストから削除したいと考えています。ただし、現在選択されている項目のビューモデル オブジェクトをボタン CommandParameter としてルーティングされたコマンド ハンドラー コードに渡す方法がわかりません。

ご指摘ありがとうございます。

マイク