問題タブ [commandbinding]
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 - WPF:バインドされたコマンドを実行できないときにボタン(分割ボタン)を有効にする方法は?
2 つの重なり合うボタンとポップアップで構成されるカスタム分割ボタンを構築しています - このように (画像はいくつかの一般的な分割ボタンを示しています):
SplitButton http://windowsclient.net/wf/blogs/jfoscoding/splitbutton.PNG
私のSplitButtonは、矢印のある右側がクリックされるとポップアップを開き、メインボタンがクリックされるとSplitButton.Commandを実行します。
ただし、私の場合、デフォルトのアクションが実行できない場合があり、その場合、メインボタンがクリックされたときに、代わりにポップアップを開きたいと思います。
私はそれを達成しましたが、問題はこれです:
- SplitButton は ToggleButton からサブクラス化されます
- ControlTemplate には、ToggleButton (一番下) と Button (短く、一番上にオーバーレイ) があります。
Button.Command="{TemplateBinding Command}"
(私ができるように<SplitButton Command="{Binding MyDefaultAction}">...
)- 問題: コマンドが実行できない場合、SplitButton 全体が無効になります。
同じコマンドを使い続けたいのですが、ボタンの動作をオーバーライドして、Command.CanExecute() が false を返したときにボタンが無効にならないようにします。これどうやってするの?
ありがとうございました!
wpf - コマンド パラメーターを相対ソースにバインドするのに役立ちます
をListBox
追加したがありContextMenu
ます。内の項目の 1 つをContextMenu
コマンドにバインドし、そのコマンドに渡されるパラメーターをListBox
コントロールの現在選択されている項目にしたいと考えています。これが私のxamlです:
これListBox
は、ビュー モデル オブジェクトにバインドされたユーザー コントロールの一部です。基になるオブジェクトのコマンド メソッドが呼び出されますが、渡されるパラメーターは常に null です。
CommandParameter
to のバインドを単純に変更してテストした{Binding}
ところ、ユーザー コントロールのデータ コンテキストがメソッドに渡されました。その結果、コマンドが機能し、パラメーターが正しく渡されていることがわかりました。ListBox
のSelectedItem
プロパティにアクセスするための正しいバインディングを取得できないようです。
ヘルプ?
c# - MVVM コマンド バインディング
私はMVVMパターンを学ぼうとしています。私が抱えている主な問題は、コマンド オブジェクトを宣言、作成、バインドする場所を学習することです。
2 つの例:
スイッチ ボードまたはメイン メニューのように機能するメイン フォームがあります。選択ボタン 1 とビュー 1 が表示され、選択ボタン 2 とビュー 2 が表示されます。偉大な。ここで、メイン フォームに戻りたいので、ビュー 1 (およびビュー 2) に「メイン メニュー」というボタンが必要です。「ShowMainMenu」コマンドにバインドできるようにするには、コマンドとコマンド ハンドラをどこで定義すればよいですか? View2ViewModel でそれらを作成できますが、メイン ビューを表示するアクセス権がありませんか? または、MainView モデルで thim を作成することもできますが、子ビュー モデルでそれらにバインドするにはどうすればよいですか (mvvm の推奨事項に従って RelayCommand obejct を使用しており、親にバブルアップしません)。
1 つのメイン ウィンドウ ビューに 2 つのユーザー コントロールが表示されています。これらを MainView、UC1、および UC2 と呼びましょう。これらのそれぞれには、ViewModel MainViewModel、UC1ViewModel、UC2View Model があります。UC1 に「AddItem」というボタンがあります。UC2 のリストにアイテムを追加する必要があります。「AddItemCommand」を設定してバインドする正しい方法は何ですか。コマンドは、MainViewModel、Uc1ViewModel、または UC2ViewModel にある必要がありますか? そして、どのように私はそれにバインドする必要があります。
ご協力いただきありがとうございます。
wpf - ユーザーコントロールへのコマンドバインディングドラッグ/ドロップ
WPFのコマンドパターンを使用して、ユーザーコントロールのドラッグアンドドロップイベントに応答するUIを作成するにはどうすればよいですか?
wpf - ListBox.ItemTemplate として使用される UserControl のコマンド バインド
私は をListbox
としてUserControl
持っていDataTemplate
ます。これUserControl
にはButton
、リストからそのアイテムを削除するための があります。
は次のItemsSource
ように定義されます。
これがUserControl
簡略化されたものです:
ユーザーがRemove
ボタンをクリックすると、このアイテムが から削除されますObservableCollection
。
問題は、DataContext
for eachListBoxItem
が、 を保持する ViewModel とは異なる ViewModel であることObservableCollection
です。
Remove
ボタンをICommand
「親」ビューモデルにバインドする方法がわかりません。どんな助けでも大歓迎です。本当にありがとう。
wpf - WPF でのコマンド バインディング メモリ リーク
RoutedUICommand への CommandBinding を持つユーザー コントロールを作成すると、メモリ リークが発生するのではないかと心配しています。
シナリオ:
RoutedUICommand を c クラスの static として使用し、コマンドを格納します。ユーザー コントロールに CommandBindings を実装します。ユーザー コントロールをメイン フォームに追加します。メイン フォームからユーザー コントロールを削除し、それへの参照を null に設定します。
コマンド バインディングの canExecute は引き続き起動します。UserControl への参照がないため、リークしています。フォームが閉じられた後も長時間発火し続けます。(停止するのを見たことがありません)ガベージコレクションを強制すると、収集されます(canExecuteの起動が停止します)
これを説明するテストプロジェクトがあります。メソッドを起動するオブジェクトのハッシュ コードを出力する canExecute に Console.WriteLine があります。新しいユーザー コントロールを追加するためのボタンと、それを削除するためのボタンがあります。
これは気にしなくていいのでしょうか?強制された場合、ユーザーコントロールは収集されます。これは、次のコレクションで収集されるということですか? アプリのパフォーマンスの低下に気づき、メモリ リークなどを追跡しています。多くの UI 要素を含む複雑なフォームがあり、レイアウトから削除すると、プロセッサとメモリ領域を使い果たしています。(多くのコマンドを使用します) ビジュアル ツリーから何かを削除すると、ルーティング イベントを受信できなくなると思いました。私は何が欠けていますか?
wpf - 要素がビジュアル ツリーから削除された後、どのように commandBinding の CanExecute を起動できますか?
ここで関連する質問があります。ここでは、コマンド バインディングを使用したユーザー コントロールがあります。ユーザー コントロールはビジュアル ツリーから削除されていますが、canExecute はまだ起動しています。コマンディング モデルについての私の理解では、ルーティング イベントのようにバブリングしてトンネリングするというものでした。では、コマンド バインディングがアタッチされた要素がビジュアル ツリーに存在しなくなったら、どのように CanExecute を起動できるでしょうか。
wpf - WPF MVVM:コントロールへのICommandバインディング
MVVMで使用されているコマンドバインディングを完全に失いました。オブジェクトをウィンドウにバインドしたり、そのコマンドをコントロールにバインドして、メソッドを取得するにはどうすればよいButton
Click
ですか?
これがCustomerViewModel
クラスです:
ViewModelBase
INotifyPropertyChanged
インターフェイスを実装しますButton
。コマンドにバインドする方法は次のとおりです。
のインスタンスは、を含むウィンドウのにCustomerViewModel
割り当てられます。DataContext
Button
与えられた例は機能していません:メソッドにブレークポイントを入れましたSave
が、実行がメソッドに渡されません。私は(スタックオーバーフローでも)多くの例を見てきましたが、バインディングをどのように指定すべきか理解できません。
アドバイスしてください、どんな助けでもありがたいです。
ありがとう。
PSおそらく私RelativeSource
はボタンバインディングで指定する必要があります...このようなもの:
しかし、どのタイプを祖先に指定する必要がありますか?
wpf - コマンドへの ListBox MouseBinding が機能しない
MouseDoubleClick (または PreviewMouseDoubleClick) を、カスタム WPF Control で定義されたカスタム Commandにバインドしたいと考えています。
問題は、それが機能しないことです。
c# - コマンドから UI を変更する - WPF でコマンド バインディングを使用する
私の WPF アプリケーションには、TextBox と Button があります。ボタンには、テキストに対して何かを行うコマンドにバインドされたコマンドがあります。
ここで、ボタンをクリックして TextBox もクリアするアクションが必要です。これを行う最善の方法は何ですか?2 つのオプションが表示されます。
Button にも Click イベントを追加して、テキストを明確にすることができます。これは、アクションが正しく実行される順序に依存して、アクションを 2 つの場所に分割することになるため、私には良い考えのようには思えません。
ここで使用したオプションは、TextBox.Text プロパティの代わりに TextBox 全体を渡すことです。そうすることで、コマンドは最初にテキストを取得して使用し、次に TextBox をクリアできます。私のバインディングは同じですが、「パス」はありません:
そして、私のコマンドの重要な部分:
これに関する私の問題は、コマンドが UI コンポーネントに依存するようになったことと、UI がコマンドに実際に変更を加えることに依存していることです。私はこれに満足しているわけではありません。より良い方法はありますか?