パラメータ - wpf visibility multibinding
WPFバインディングを使用して2つのコマンドパラメータを渡す (3)
ConverterでTupleを使うことについては、 'string'の代わりに 'object'を使う方が良いでしょう。
public class YourConverter : IMultiValueConverter
{
public object Convert(object[] values, ...)
{
Tuple<object, object> tuple = new Tuple<object, object>(values[0], values[1]);
return tuple;
}
}
Commandの実行ロジックは次のようになります
public void OnExecute(object parameter)
{
var param = (Tuple<object, object>) parameter;
// e.g. for two TextBox object
var txtZip = (System.Windows.Controls.TextBox)param.Item1;
var txtCity = (System.Windows.Controls.TextBox)param.Item2;
}
(2つのTextBoxオブジェクトを使用して)パラメータを作成するコンバーターを使用したマルチバインド
<Button Content="Zip/City paste" Command="{Binding PasteClick}" >
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource YourConvert}">
<Binding ElementName="txtZip"/>
<Binding ElementName="txtCity"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
私はXAMLファイルから以下の標準構文を使って実行しているコマンドを持っています:
<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand}"/>
これは、この操作をユーザーの期待通りに行うために、ビューから2つの情報を必要としていることを認識するまでうまく機能しました(キャンバスの幅と高さは特にありません)。
私のコマンドに引数として配列を渡すことは可能ですが、CommandParameterの2つのキャンバスプロパティへのバインディングを指定する方法はありません。
<Button Content="Zoom"
Command="{Binding MyViewModel.ZoomCommand"
CommandParameter={Binding ElementName=MyCanvas, Path=Width}"/>
私のコマンドに幅と高さの両方を渡すにはどうしたらいいですか? XAMLのコマンドを使用してこれを行うことは可能ではないようで、この情報をズームメソッドに渡すには、コードビハインドでクリックハンドラを呼び出す必要があります。
ConverterでTupleを使用し、OnExecuteでパラメータオブジェクトをTupleにキャストし直します。
public class YourConverter : IMultiValueConverter
{
public object Convert(object[] values, ...)
{
Tuple<string, string> tuple = new Tuple<string, string>(
(string)values[0], (string)values[1]);
return (object)tuple;
}
}
// ...
public void OnExecute(object parameter)
{
var param = (Tuple<string, string>) parameter;
}
選択したソリューションのコンバータでは、values.Clone()を追加する必要があります。それ以外の場合は、コマンドのパラメータend null
public class YourConverter : IMultiValueConverter
{
public object Convert(object[] values, ...)
{
return values.Clone();
}
...
}