Passare due parametri di comando usando un binding WPF

Ho un comando che sto eseguendo dal mio file XAML usando la seguente syntax standard:

Questo ha funzionato fino a quando ho capito che avevo bisogno di DUE informazioni sulla vista per rendere questa operazione completa nel modo in cui gli utenti si aspettano (la larghezza e l’altezza della canvas in modo speculare).

Sembra che sia ansible passare un array come argomento al mio comando, ma non vedo che ci sia un modo per specificare il binding alle mie due proprietà canvas nel CommandParameter:

 

Come posso passare sia la larghezza che l’altezza al mio comando? Non sembra che questo sia ansible usando i comandi di XAML e ho bisogno di colbind un gestore di clic nel mio codebehind per far passare queste informazioni al mio metodo di zoom.

In primo luogo, se stai facendo MVVM di solito queste informazioni sono disponibili per la tua VM tramite proprietà separate dalla vista. Questo ti evita di dover passare qualsiasi parametro ai tuoi comandi.

Tuttavia, è ansible anche il multi-binding e utilizzare un convertitore per creare i parametri:

  

Nel tuo convertitore:

 public class YourConverter : IMultiValueConverter { public object Convert(object[] values, ...) { return values.Clone(); } ... } 

Quindi, nella logica di esecuzione del comando:

 public void OnExecute(object parameter) { var values = (object[])parameter; var width = (double)values[0]; var height = (double)values[1]; } 

Nel convertitore della soluzione scelta, è necessario aggiungere values.Clone () altrimenti i parametri nel comando terminano null

 public class YourConverter : IMultiValueConverter { public object Convert(object[] values, ...) { return values.Clone(); } ... } 

Usa Tuple in Converter e in OnExecute, riporta l’object parametro a Tuple.

 public class YourConverter : IMultiValueConverter { public object Convert(object[] values, ...) { Tuple tuple = new Tuple( (string)values[0], (string)values[1]); return (object)tuple; } } // ... public void OnExecute(object parameter) { var param = (Tuple) parameter; } 

A proposito di usare Tuple in Converter, sarebbe meglio usare ‘object’ invece di ‘string’, in modo che funzioni per tutti i tipi di oggetti senza limitazione dell’object ‘stringa’.

 public class YourConverter : IMultiValueConverter { public object Convert(object[] values, ...) { Tuple tuple = new Tuple(values[0], values[1]); return tuple; } } 

Quindi la logica di esecuzione in Command potrebbe essere così

 public void OnExecute(object parameter) { var param = (Tuple) parameter; // eg for two TextBox object var txtZip = (System.Windows.Controls.TextBox)param.Item1; var txtCity = (System.Windows.Controls.TextBox)param.Item2; } 

e multi-binding con convertitore per creare i parametri (con due oggetti TextBox)