問題タブ [relaycommand]
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.
mvvm - MVVM ルーティングおよびリレー コマンド
RoutedCommandとRelayCommandの違いは何ですか? RoutedCommand をいつ使用し、MVVM パターンで RelayCommand を使用するのはいつですか?
c# - wpfでRelayCommandを使用するにはどうすればよいですか?
どうすれば RelayCommand
wpfで使用できますか?
wpf - MVVM で RelayCommand の処理をビュー モデルの親に指示する適切な方法
私はMVVMに非常に慣れていないので、ある程度はWPFでさえも我慢してください...
アプリケーションの状態に応じてさまざまなタイプのビューモデル インスタンスを含む、メイン ウィンドウを持つ MVVM アプリケーションがあります。これらのビューモデルの 1 つは、アプリケーションを再起動し、別のユーザーとしてデータベースにログインするためのボタンを含むオプション画面です。 RelayCommand を使用して、親 (メイン ウィンドウ) にこのコマンドを処理させ、Window.Close() メソッド呼び出しを発行させるにはどうすればよいですか?
wpf - .NETデリゲートの平等?
とにかく、これが問題だと思います。ICommand を 2 つのデリゲートで装飾する RelayCommand を使用しています。1 つは _canExecute の Predicate で、もう 1 つは _execute メソッドの Action です。
---背景の動機-
動機は、 WPFプレゼンテーションの ViewModel の単体テストに関係しています。よくあるパターンは、ObservableCollection を持つ 1 つの ViewModel があり、そのコレクション内のデータが、(ViewModel のコレクションに変換する必要がある) ソース データが与えられたときに期待するものであることを単体テストで証明したいというものです。デバッガーでは両方のコレクションのデータが同じように見えますが、ViewModel の RelayCommand での等価エラーが原因でテストが失敗したように見えます。失敗した単体テストの例を次に示します。
--- デリゲートの平等に戻る ----
これが RelayCommand のコードです。これは基本的に、この問題を解決するために私が追加した平等の実装を伴う、Josh Smith のアイデアの直接のぼったくりです。
_execute デリゲートを同じメソッドに効果的に設定した単体テストでは (どちらの場合も _canExecute は null です)、単体テストは次の行で失敗します。
デバッガ出力:
私が欠けているものと修正が何であるかを誰かが説明できますか?
---- 編集された発言 ----
Mehrdad が指摘したように、デバッグ セッションからの get_CloseCommand は、最初は少し奇妙に見えます。これは実際にはプロパティの取得にすぎませんが、機能させるためにトリックを行う必要がある場合、デリゲートの等価性がなぜ問題になるのかという点が浮き彫りになります。
MVVM のポイントの一部は、プレゼンテーションで役立つ可能性のあるものをすべてプロパティとして公開することです。これにより、WPF バインディングを使用できます。私がテストしていた特定のクラスには、その階層に WorkspaceViewModel があります。これは、閉じるコマンド プロパティを既に持っている単なる ViewModel です。コードは次のとおりです。
public 抽象クラス WorkspaceViewModel : ViewModelBase {
close コマンドは RelayCommand であり、単体テストを機能させるために equals を使っていることがわかります。
@Merhdadこれは、等価比較でTricksterのdelegate.Methodを使用した場合にのみ機能する単体テストです。
[TestFixture] public class WorkspaceViewModelTests { private WorkspaceViewModel vm1; プライベート WorkspaceViewModel vm2;
----- MERHDADのアイデアを使用するための最新の編集
デバッガ出力 ?valueOfThisObject {Smack.Wpf.ViewModel.RelayCommand} base {SharpArch.Core.DomainModel.ValueObject}: {Smack.Wpf.ViewModel.RelayCommand} _canExecute: null _execute: {Method = {Void _executeClose(System.Object) }}
これは、コードを次のように変更した後の結果です。
wpf - wpfmvvmの平等
私が取り組んでいるWPFプロジェクトでMVVMを使用したいと思います。これには、RelayCommands(別名DelegateCommands)の使用も含まれます。ここで概説するように、ViewModelsの同等性を実装する際に、興味深いがフラストレーションの問題に直面しています。ViewModel階層に基本クラスがあり、同等性の比較の一部としてすべてのプロパティを反射的に調べます。コマンドは、そうではないように見えても、常に失敗します。
他の人は、平等を扱うこの設計アプローチをどのように使用していますか?
乾杯、
ベリール
wpf - Josh SmithによるRelayCommandの実装に欠陥がありますか?
Josh Smithの記事「Model-View-ViewModelデザインパターンを使用したWPFアプリ」、具体的にはRelayCommand
(図3)の実装例を検討してください。(この質問については、記事全体を読む必要はありません。)
一般的に、実装は優れていると思いますが、のイベントCanExecuteChanged
へのサブスクリプションの委任について質問があります。州のドキュメント:CommandManager
RequerySuggested
RequerySuggested
このイベントは静的であるため、弱参照としてのみハンドラーを保持します。このイベントをリッスンするオブジェクトは、ガベージコレクションを回避するために、イベントハンドラーへの強力な参照を保持する必要があります。これは、プライベートフィールドを用意し、このイベントにアタッチする前または後にハンドラーを値として割り当てることで実現できます。
しかし、のサンプル実装はRelayCommand
、サブスクライブされたハンドラーに対してそのようなものを維持していません。
- これにより、弱参照が
RelayCommand
クライアントにリークされ、ユーザーがライブ参照RelayCommand
の実装を理解してCanExecuteChanged
維持する必要がありますか? もしそうなら、例えば、加入者
/li>RelayCommand
の潜在的な時期尚早のGCを軽減するために、の実装を次のようなものに変更することは理にかなっていますか?CanExecuteChanged
c# - RelayCommandで実行できます動作しない
MVVM Light V3 alpha3を使用してWPF4アプリ(VS2010 RCを使用)を作成していますが、ここで奇妙な動作が発生しています...
を開くコマンドがありWindow
、そのウィンドウがViewModelなどを作成します-そこには何も奇妙なことはありません。
その中でWindow
私はいくつかRelayCommand
の例を持っています:
再び奇妙なことは何もありません-それは私が期待したように動作します。
問題は、汎用のRelayCommandでCanExecuteメソッド/ラムダ式を使用できないことです。
これは機能します:
しかし、これはしません:
ウィンドウが表示されません。つまり、ウィンドウを開くボタンをクリックすると、アプリがブロックされ、数秒後に、ウィンドウのメソッドが(オブジェクトのインスタンスに設定されていないオブジェクト参照)InitializeComponent
をスローします。NullReferenceException
つまり、CanExecute
メソッドをに配置するRelayCommand<T>
と、そのViewModel(を含む)Window
を所有するRelayCommand<T>
はインスタンス化できません。を削除するCanExecute
と、がWindow
表示されます。
ここで問題はどこにありますか?よくわかりません。
ありがとうございました。
編集:要求に応じて、ここにスタックトレースがあります:
wpf - WPF MVVM エクスプローラーのようなアプリケーションで現在の選択に依存するメニュー項目を実装する方法
私は WPF と MVVM が初めてで、両方を利用するアプリケーションに取り組んでいます。このアプリケーションは Windows エクスプローラーに似ているため、メニュー付きのメイン ウィンドウ (ShellViewModel)、ツリー コントロール (TreeViewModel)、およびリスト コントロール (ListViewModel) を備えたアプリを検討してください。Edit -> Delete などのメニュー項目を実装したいと考えています。これは、現在選択されている項目 (ツリーまたはリスト内にある可能性があります) を削除します。
Josh Smith の RelayCommand を使用しており、ShellViewModel で menuitem を DeleteItemCommand にバインドするのは簡単です。ただし、DeleteItemCommand を実装するには、ShellViewModel と 2 つの子ビュー モデル (TreeViewModel と ListViewModel) との間のかなり緊密な結合が必要であり、フォーカス/選択を追跡し、アクションを適切な子に向けて実装する必要があります。それは私には間違っているようで、何かが足りないと思います。
ブックキーピングを行うためのフォーカス マネージャーやセレクション マネージャーを作成することはそれほど難しくないように思われ、クラスを結合しなくても実行できます。ウィンドウ システムは、どのビューにフォーカスがあるかを既に追跡しており、コードを複製しているように見えます。
私がよくわからないのは、コマンドを ShellViewModel から ListViewModel または TreeViewModel のいずれかにルーティングして、コードを混乱させることなく実際の作業を行う方法です。いつの日か、アプリケーションは 2 つ以上の子を含むように拡張される予定です。その拡張をできる限り無痛にするために、シェルが子をできる限り無視するようにしたいと考えています。
いくつかのサンプル WPF/MVVM アプリケーション (Karl Shifflett の CipherText、Josh Smith の MVVM Demoなど) を見ても、これを行うコードは見たことがありません (または理解できませんでした)。
私のアプローチが根本から外れていると思われるか、小さなニュアンスが欠けているだけであるかに関係なく、あなたの考えを共有して、私が軌道に乗るのを手伝ってください. ありがとう!
wpf - ユーザーコントロールからのWPFリレーコマンド
私はWPFが初めてで、正しい方法で物事を行おうとする精神で、アプリケーションにMVVMを実装しようとしました。Josh Smith の頻繁に言及されている記事を利用しましたが、自分がどれほど知識が乏しいかということに気づかされただけでなく、少し困惑しました。
具体的には、RelayCommand オブジェクトを使用してページ上のボタンを直接処理するページがあり、これで問題ありません。ただし、ボタン (保存) は、最終的には他のボタンも含むユーザー コントロール上にあり、そのコントロールは多くのページで使用されます。
私の質問はこれです。コマンドをユーザー コントロールからそれを含むページ (ビューモデル) に中継するにはどうすればよいですか? コマンドにバインドすると
ユーザー コントロールでは、実際にはビューモデルで処理する必要がある場合に、ユーザー コントロール自体で Save メソッドを使用する必要があります。
誰でも助けることができますか?