ViewModelで定義されたRelayCommandを使用してパラメーターを渡す(Josh Smithの例から)
-
03-07-2019 - |
質問
RelayCommandを使用して、アプリケーションのXAML(ビュー)で定義されたパラメーターをViewModelクラスに渡します。 Josh SmithのMVVMに関する優れた記事に従って、以下を実装しました。 。
XAMLコード
<Button
Command="{Binding Path=ACommandWithAParameter}"
CommandParameter="Orange"
HorizontalAlignment="Left"
Style="{DynamicResource SimpleButton}"
VerticalAlignment="Top"
Content="Button"/>
ViewModelコード
public RelayCommand _aCommandWithAParameter;
/// <summary>
/// Returns a command with a parameter
/// </summary>
public RelayCommand ACommandWithAParameter
{
get
{
if (_aCommandWithAParameter == null)
{
_aCommandWithAParameter = new RelayCommand(
param => this.CommandWithAParameter("Apple")
);
}
return _aCommandWithAParameter;
}
}
public void CommandWithAParameter(String aParameter)
{
String theParameter = aParameter;
}
#endregion
CommandWithAParameterメソッドにブレークポイントを設定し、aParameterが<!> quot; Orange <!> quot;ではなく<!> quot; Apple <!> quot;に設定されていることを確認しました。これは、メソッドCommandWithAParameterがリテラル文字列<!> quot; Apple <!> quot;で呼び出されているため明らかです。
ただし、実行スタックを調べると、XAMLで設定した<!> quot; Orange <!> quot;というCommandParameterが、ICommand ExecuteインターフェイスメソッドのRelayCommand実装のパラメーター値であることがわかります。
これは、実行スタックの以下のメソッドのパラメーターの値が<!> quot; Orange <!> quot;、
public void Execute(object parameter)
{
_execute(parameter);
}
把握しようとしているのは、CommandParameter <!> quot; Orange <!> quot;でCommandWithAParameterメソッドを呼び出すことができるように、RelayCommand ACommandWithAParameterプロパティを作成する方法です。 XAMLで定義されています。
これを行う方法はありますか
これを行う理由<!> quot; On The Fly Localization <!> quot;の一部 特定の実装では、複数のボタンにバインドできるSetLanguage RelayCommandを作成します。 2文字の言語識別子(<!> quot; en <!> quot;、<!> quot; es <!> quot;、<!> quot; ja <!> quot;など)を渡したいCommandParameterを使用し、<!> quot; set language <!> quotごとに定義します。 XAMLで定義されたボタン。 ViewModelの各RelayCommandに2文字の言語識別子をサポートおよびハードコーディングする言語ごとにSetLanguageToXXXコマンドを作成する必要を避けたい。
解決
最初にラムダを指定するのに余分な複雑さがある理由がわかりません。なぜこれをしないのですか:
if (_aCommandWithAParameter == null)
{
_aCommandWithAParameter = new RelayCommand<object>(CommandWithAParameter);
}
private void CommandWithAParameter(object state)
{
var str = state as string;
}
他のヒント
次のように、ラムダのパラメーターをコマンドに渡します。
if (_aCommandWithAParameter == null)
{
_aCommandWithAParameter = new RelayCommand(
param => this.CommandWithAParameter(param)
);
}
私のために働く前にここに投稿されたものはありません。
すべての回答に<object>
の後にRelayCommand
がありません!
これは私のために働く:
public RelayCommand<object> OKCommand
{
get
{
if (_okCommand == null)
_okCommand = new RelayCommand<object>(OkCommand_Execute);
return _okCommand;
}
}
private RelayCommand<object> _okCommand = null;
private void OkCommand_Execute(object obj)
{
Result = true;
}
CanExecute
メソッドを使用する場合は、次のコードを使用します。
_okCommand = new RelayCommand<object>(OkCommand_Execute, OkCommand_CanExecute);
private bool OkCommand_CanExecute(object obj) { }
ポイントを売ろうとしています。これが機能するかどうかを確認してください...
http:// mywpf- visu.blogspot.com/2009/12/relay-command-how-to-pass-parameter.html
これは、この問題に関するヘルプを探していたため、コマンドパラメータの簡単な解決策です。私は十分にシンプルなオンラインのものを見つけることができませんでした。次のソリューションは、relaycommandを使用している場合にうまく機能します。 コマンドパラメーターを使用してクリックされたURL値を取得する必要があるハイパーリンクがいくつかありました。
ステップ1:リレーコマンドで、パラメーターオブジェクト値を保持する単純なプロパティを作成します。 parametervalueまたは任意の名前で呼び出すことができます。
public object ParameterValue
{
get;
set;
}
ステップ2:RelayCommandクラスのExecuteメソッドで、上記で作成した値またはプロパティをExecuteメソッドからのパラメーターに設定します。
readonly Action<object> m_execute; // Action to execute
public void Execute(object parameter)
{
this.ParameterValue = parameter;
m_execute(parameter);
}
ステップ3:コマンド実行時に取得したい値にxamlのCommandParameterをバインドできるようになりました。 例:
<TextBlock>
<Hyperlink Command="{Binding Path=NavigateUrlCmd}"
CommandParameter="{Binding ElementName=tbwebsite, Path=Text}">
<TextBlock Name="tbwebsite" Text="{Binding Path=website}"/>
</Hyperlink>
</TextBlock>
chickenCommandというコマンドがある場合、実行時にパラメーターにアクセスできます。 chickenCommand.ParameterValue
これが誰かの助けになることを願っています。これまでのすべての助けてくれてありがとう。
lamda式のメソッド名への参照をコンパイルエラーで置き換えることはできません。明らかに、驚くことではないが、ラムダの代わりに非静的メソッド名参照を使用することはできません。 <!> quot; added complexity <!> quot;とはほとんど見えません。一貫してラムダを渡すことは私にとって理にかなっています。