問題タブ [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 投票する
1 に答える
417 参照

wpf - 変化しないプロパティへのWPFバインディング

私はMVVMパターンを使用しており、開始日プロパティを持つPOCO(モデル内)を持っています。

WPFウィンドウ/ユーザーコントロールのコントロールに開始日からの経過時間を表示したい...

ModelView プロパティを UI コントロールにバインドし、この期間を自動的に更新する方法がわかりません...誰か方法を提案できますか?

何か (タイマーまたはスレッド) を使用して ModelView の期間プロパティを更新できますが、プロパティ値が変更されたときにのみ UI が更新されることを理解しているため、他の方法はありません。ただし、私の POCO の開始日は変更されていません。計算された値である経過時間が変更されているだけです。

何か不足していますか?

0 投票する
5 に答える
10747 参照

.net - XAML のみを使用して左クリックで ContextMenu を表示する

WPF の既定の動作はContextMenu、ユーザーが右クリックしたときに表示することです。ContextMenuユーザーが左クリックしたときに表示したい。これは の単純なプロパティであるように見えますがContextMenu、そうではありません。

コード ビハインドでイベントを処理しLeftMouseButtonDown、コンテキスト メニューを表示するように調整しました。

プロジェクトで MVVM を使用しDataTemplateています。つまり、コンテキスト メニューを持つアイテムに s を使用しています。コード ビハインドを取り除き、XAML でトリガーまたはプロパティを使用してコンテキスト メニューを表示する方法を見つける方がはるかに洗練されています。

この問題に対するアイデアや解決策はありますか?

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

silverlight - Silverlight でイベントをアンフックするタイミング

1 行の要約: Silverlight2 の UserControl のコンストラクターで作成されたイベント ハンドラーをアンフックするためのベスト プラクティスは何ですか?

背景: 現在、Silverlight2 で基幹業務アプリケーションを構築しています。Silverlight はブラウザー プラグインであるため、ウィンドウの概念はありません。すべては UserControls 内で行われます。アプリケーションでさまざまな「フォーム」を処理する方法は、Viewbox を含む最上位のユーザー コントロールを使用することです。別のフォームを表示するには、Viewbox の Child プロパティを別の UserControls に設定します。私のアプリには、フォームを開閉するために呼び出されるシングルトン PageManager クラスがあります。フォーム (UserControls) はスタックに格納されます。フォームを開くとスタックの一番上に置かれ、フォームを閉じるとスタックから削除され、その下のフォームが表示されます。

Model-View-ViewModel パターンに従おうとしています。各フォーム (UserControl から派生) には、View のすべてのデータを管理する ViewModel があります。ViewModel はイベントを公開するため、読み込みや保存などの操作が完了したときに UI に通知できます。

私のフォームでは、ViewModel を取得した後、コンストラクターでイベントをサブスクライブします。

私の質問は次のとおりです。このイベントをサブスクライブしたので、いつハンドラーを削除しますか? デストラクタを作成してそこで実行しますか?それとも、ガベージ コレクタがすべての参照 (つまり、イベント ハンドラ) がなくなるまでオブジェクトを破棄しない鶏と卵の状況を作り出しますか? PageManager によってフォームが閉じられたときに呼び出される UnhookEvents 関数を指定する、フォームが実装する必要があるインターフェイスを作成する必要がありますか?

編集:返信ありがとうございます。ViewModel がフォーム (UserControl) よりも長く続く状況はどうですか? 私のアプリの一部では、ユーザーは非常に複雑な構造を作成できますが、95% のケースでは、はるかに単純です。私がやったことは、同じViewModelを使用する2つのフォームを作成することでした. ユーザーは単純なフォームへの入力を開始してから、ViewModel を渡して新しいフォームを作成する詳細モードに切り替えることができます。

簡単なセットアップ フォームの場合:

詳細設定フォームで:

PageManager.Close の後、フォームを参照しているのは ViewModel 内のイベントだけです。私はそれが私がそれらを外す必要がある場所だと思います。

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

multithreading - モデルとビューの間でデータを共有する方法は?

現在、入力データからモデルを構築し、そのデータをユーザーに表示するアプリケーションの再設計に取り組んでいます。現在のシステムには、モデルを構築するためのスレッド、モデルの視覚化を構築するためのスレッド、および視覚化を表示するスレッドがあります。私が抱えている問題は、モデリングと視覚化のスレッド間でポインターが渡されることです。スレッドを安全にするために、モデル内のすべてのオブジェクトにミューテックスが必要です。これは、システム内でアクティブなミューテックスが数千あり、両方のスレッドがリソースを競合するため、多くのストールが発生していることを意味します。

これら 3 つのスレッドが存在することを考えると、効率的かつスレッド セーフな方法でモデリング スレッドとビジュアライゼーション スレッド間でデータを共有する最善の方法は何でしょうか? 一部のデータ構造は大きく、モデリング スレッドのサイクルごとに変更されるため、パスごとにデータのコピーを作成するのは少し気が進まない。

編集:

私たちが望んでいるシステム全体の合計遅延は、ディスプレイの変化を示すディスプレイへのメッセージを受信して​​から最大 100 ミリ秒になることです。可能であれば高速化を望んでいますが、より重要なことは、一貫性を保つ必要があることです。現在、ミューテックスの競合により、サイクル タイムに大きなばらつきが見られます。モデリングからビジュアライゼーションに移行するデータは、2D 高さマップ (最大 18000 セル相当のデータ) によって支配されています。ただし、モデルの更新で更新されるセルの実際の数は大幅に少なく、おそらくわずか数百です。

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

c# - WPF ComboBox をカスタム リストにバインドする

SelectedItem/SelectedValue を更新していないように見える ComboBox があります。

ComboBox ItemsSource は、一連の RAS 電話帳エントリを CollectionView として一覧表示する ViewModel クラスのプロパティにバインドされています。次に、SelectedItemまたはの両方SelectedValueを ViewModel の別のプロパティに (別々の時間に) バインドしました。データバインディングによって設定された値をデバッグするために保存コマンドに MessageBox を追加しましたが、SelectedItem/SelectedValueバインディングが設定されていません。

ViewModel クラスは次のようになります。

_phonebookEntries コレクションは、コンストラクターでビジネス オブジェクトから初期化されています。ComboBox XAML は次のようになります。

ComboBox に表示される実際の文字列値のみに関心があります。オブジェクトの他のプロパティには関心がありません。これは、VPN 接続を確立するときに RAS に渡す必要がある値であるためDisplayMemberPathですSelectedValuePath。 ConnectionViewModel。ComboBox は、DataContext が ViewModel インスタンスに設定されている Window にDataTemplate適用されます。ItemsControl

ComboBox はアイテムのリストを正しく表示し、UI で問題なくアイテムを選択できます。ただし、コマンドからメッセージ ボックスを表示すると、PhonebookEntry プロパティには ComboBox から選択された値ではなく、初期値が含まれています。他の TextBox インスタンスは正常に更新されており、MessageBox に表示されています。

ComboBox のデータバインドで何が欠けていますか? 私は多くの検索を行ってきましたが、間違っていることは何も見つからないようです。


これは私が見ている動作ですが、私の特定のコンテキストでは何らかの理由で機能していません。

CollectionViewConnectionViewModelsを持つ MainWindowViewModel があります。MainWindowView.xaml ファイルの分離コードで、DataContext を MainWindowViewModel に設定します。MainWindowView.xaml には、ItemsControlConnectionViewModels のコレクションへのバインドがあります。ComboBox と他のいくつかの TextBoxes を保持する DataTemplate があります。TextBoxes は、 を使用して ConnectionViewModel のプロパティに直接バインドされますText="{Binding Path=ConnectionName}"

XAML コード ビハインド:

次に XAML:

TextBoxes はすべて正しくバインドされ、データは TextBox と ViewModel の間で問題なく移動します。機能していないのは ComboBox だけです。

PhonebookEntry クラスに関するあなたの仮定は正しいです。

私が行っている仮定は、DataTemplate で使用される DataContext がバインディング階層を介して自動的に設定されるため、ItemsControl. それは私には少しばかげているように思えます。


上記の例に基づいて、問題を実証するテスト実装を次に示します。

XAML:

分離コード:

その例を実行すると、私が話している動作が得られます。TextBox は、編集時にバインディングを適切に更新しますが、ComboBox は更新しません。私が実際に行った唯一のことは、親ViewModelを導入することだけなので、非常に混乱しています。

私は現在、DataContext の子にバインドされたアイテムがその DataContext としてその子を持っているという印象の下で働いています。これを何らかの方法で解決するドキュメントが見つかりません。

すなわち、

Window -> DataContext =
MainWindowViewModel ..Items -> DataContext.PhonebookEntries にバインド
....Item -> DataContext = PhonebookEntry (暗黙的に関連付け)

それが私の仮定をよりよく説明するかどうかはわかりません(?)。


私の仮定を確認するために、TextBox のバインディングを次のように変更します。

これにより、TextBox バインディング ルート (DataContext と比較しています) が ConnectionViewModel インスタンスであることがわかります。

0 投票する
3 に答える
1311 参照

silverlight - Silverlight で MVVM を使用してコマンド パターンを使用してコントロールごとに複数のイベントを処理するにはどうすればよいですか?

コマンドを Silverlight コントロール イベントに関連付けるために SLExtensions コマンド パターン ( http://www.codeplex.com/SLExtensions ) を使用している人はいますか? 私が見たところ、コントロールごとに 1 つのイベントに対してのみコマンドをアタッチできます。たとえば、ボタンのクリック イベント、テキスト ボックスのキーダウン イベントなどのみを追加できます。

コントロールごとに複数のイベントを追加したい場合はどうすればよいですか? たとえば、ボタンの Click イベントと Drop イベントの両方にコマンドを追加したい場合はどうでしょう。そのままでは、SLExtensions コードでこれを処理する方法はないようです。

ところで、これは Model-View-ViewModel (MVVM) コンテキストにあります。

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

model-view-controller - MVP パターン: 複数のプレゼンターを分離する必要がありますか、それとも直接通信できますか?

次のようなUIがあります。

この UI を駆動するためにMVP パターンを使用しています。

ここではかなり単純化していますが、分割して征服するために、Presenter を 2 つに分割したいと思います。1 つは、左側のビューでユーザーのジェスチャーを処理します (ユーザーは、このビューでモデル リストを変更します。たとえば、並べ替え)。もう 1 つのプレゼンターは、右側のビューでユーザー ジェスチャを処理します (ユーザーは、このビューで個々のモデルを変更します)。

左側のプレゼンターはモデルのリスト全体とやり取りしますが、右側のプレゼンターは単一のモデルのみとやり取りします。つまり、ユーザーが左側のリストから選択したモデルです。IOW UI は左から右に駆動されます。

ユーザーが左側のモデルを選択 (つまり、クリック) すると、現在の実装は (大まかに) 次のようになります。

これは、MVPパターン、またはその問題に関するMVC GUIパターンに関して、私が曖昧な部分です。

  1. このように、UI を複数のプレゼンターで操作できますか?
  2. 複数のプレゼンターを分離する必要がありますか、それともここに示すように互いに直接通信できますか?

だから私の質問は次のようになります:ユーザーがのビューでモデルを選択したことを示す最良の方法は何RightPresenterLeftPresenterですか?

0 投票する
3 に答える
17909 参照

wpf - WebBrowser を使用した WPF のモデル ビュー ViewModel

MVVMパターンを使用してWPFでアプリを作成しています。プロパティとコマンドへのバインドに限定されています

ただし、プロパティではなく、メソッドへのパラメーターとしてコンテンツの html 文字列のみを取得できる WebBrowser コントロールを使用したいと考えています。

必要なプロパティを持つ Webbrowser から派生した新しいコントロールを作成しようとしましたが、コントロール クラスが封印されています。ラッパー コントロールを作成しようとしましたが、依存関係プロパティにさまざまな問題があり、解決するのが難しいようでした。

コード ビハインド ファイルのコードに頼らずに、パラメーター (文字列) を MVVM を使用してメソッドにプッシュできる方法はありますか (これは大きな問題です)。

ありがとう

ディーン

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

.net - データグリッド内のコマンドへのバインディング

WPF アプリで MV-VM パターンを使用しています。ViewModel を ContentControl にバインドし、ウィンドウ リソースで定義されたデータ テンプレートを使用して、その ViewModel のビュー (UserControl) をレンダリングしています。

ViewModel には、アイテムのコレクションがあります。そのコレクションを、WPF ツールキットで提供されるデータ グリッドにバインドしています。また、ビュー モデルには、削除する項目 ID の引数を取る RemoveItem コマンドが定義されています。

データ グリッドでそのコマンドにどのようにバインドしますか? グリッドのデータ コンテキストはそのコレクションなので、次のようになります。

動作しません - コマンドが見つかりません。RelativeSource バインディングを行う必要があると思いますが、それはどのようなものでしょうか? 祖先の型は UserControl でしょうか、それとも ContentControl でしょうか? ViewModel は DataContext としてどこにありますか?

それとも私はここから離れていますか?

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

c# - ダブルエリミネーショントーナメントのデータ構造

Double Elimination Tournaments の作成と操作を可能にする Tournament Organizer ソフトウェアを MVVM デザイン パターンを使用するように変換して、より簡単にテストできるようにしています。そうすることで、ブラケット構造を直接操作する UI の一部のコードから「モデル」を分離しています。

これは、私がトーナメントを処理するために作成したソフトウェアの 3 回目の繰り返しになります。1 つ目は PHP で作成され、データをデータベースに格納しました。2 番目のバージョンは、私が作成した WPF バージョンで、データをメモリに格納し、XML ファイルにシリアル化します。ただし、どちらのバージョンでも、クリーンではないと感じる実装の側面があり、DRY の法則に違反しているように見えます。

二重消去ブラケットを処理するためにゼロからデータ構造を作成する場合、どのようにしますか?

ブラケットをアルゴリズム的に自動的に生成できる必要はないことに注意してください (4/8/16/32 人の事前作成されたダブルエリミネーションからのロードは、私が現在行っている方法です)、主なユースケースだけです。試合の勝者を設定し、ブラケットを通じてそれらを「進める」こと。

編集: 明確にするために、データ構造はダブル エリミネーション トーナメントを処理する必要があるため、ある試合の勝者が別の試合の敗者と競合する可能性があります。