Eu tenho um comando que estou executando no meu arquivo XAML usando a seguinte sintaxe padrão:
<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand}"/>
Isso funcionou bem até que eu percebi que precisava de DUAS informações na visualização para concluir esta operação da maneira que os usuários esperam (a largura e a altura da tela, especficamente).
Parece que é possível passar uma matriz como argumento para o meu comando, mas não vejo uma maneira de especificar a ligação para minhas duas propriedades de tela no CommandParameter:
<Button Content="Zoom"
Command="{Binding MyViewModel.ZoomCommand"
CommandParameter="{Binding ElementName=MyCanvas, Path=Width}"/>
Como passo largura e altura ao meu comando? Parece que isso não é possível usando comandos do XAML e eu preciso conectar um manipulador de cliques no meu codebehind para que essas informações passem para o meu método de zoom.
Respostas:
Em primeiro lugar, se você estiver executando o MVVM, normalmente terá essas informações disponíveis para sua VM por meio de propriedades separadas ligadas à visualização. Isso evita que você precise passar parâmetros para seus comandos.
No entanto, você também pode vincular várias vezes e usar um conversor para criar os parâmetros:
No seu conversor:
Então, na sua lógica de execução de comandos:
fonte
No conversor da solução escolhida, você deve adicionar values.Clone () caso contrário, os parâmetros no comando end null
fonte
Use Tuple no conversor e, no OnExecute, converta o objeto de parâmetro novamente em Tuple.
fonte
Se seus valores são estáticos, você pode usar
x:Array
:fonte
SystemColors
por exemplo, deverá usar emDynamicResource
vez de,StaticResource
porque o usuário pode alterar as cores do sistema via Painel de Controle durante a execução. CanvasWidth
eHeight
não são recursos e não são estáticos. Existem propriedades de instância herdadas deFrameworkElement
.Sobre o uso da Tupla no Converter, seria melhor usar 'objeto' em vez de 'string', para que funcione para todos os tipos de objetos sem limitação do objeto 'string'.
Então a lógica de execução em Command pode ser assim
e multi-bind com conversor para criar os parâmetros (com dois objetos TextBox)
fonte