Precisa de ajuda adicional para vincular vários parâmetros de comando usando multibinding
-
24-09-2019 - |
Pergunta
Eu preciso ter um manipulador de comando para um botão de toggle que pode levar vários parâmetros, a saber, a propriedade isquecida do referido ToggleButton, juntamente com um valor constante, que pode ser uma string, byte, int ... não importa.
eu encontrei esta ótima pergunta sobre então e seguiu o link da resposta e leia sobre multibinding e imultivalueConverter. Foi muito bem até que eu tivesse que escrever a multibinding, quando percebi que também precisava passar um valor constante e não poderia fazer algo como
<Binding Value="1" />
Eu então me deparei com outro Pergunta semelhante que Kent Boogaart respondeu, e então comecei a pensar em maneiras pelas quais poderia contornar isso.
Uma maneira possível é não usar o MVVM e simplesmente adicionar a propriedade TAG ao meu ToggleButton; nesse caso, minha multibinding ficaria assim:
<MultiBinding Converter="{StaticResource MyConverter}">
<MultiBinding.Bindings>
<Binding Path="IsChecked" />
<Binding Path="Tag" />
</MultiBinding.Bindings>
</MultiBinding>
Kent fez um comentário como "Se você estiver usando o MVVM, poderá contornar esse problema". No entanto, não tenho certeza se essa é uma opção para mim, apesar de ter adotado o MVVM como meu padrão WPF de necessidade escolha.
A razão pela qual digo isso é que tenho mais de um butão de algodão no UserControl, e cada um dos comandos dos ToggleButtons precisa chamar a mesma função. Mas como eles são ToggleButtons, não posso usar a propriedade ligada a isquecidas no ViewModel, porque não sei qual foi o último clicado. Suponho que poderia adicionar outra propriedade privada para acompanhar isso, mas parece um pouco bobo. No que diz respeito à constante, eu provavelmente poderia me livrar disso se fizesse a ideia de rastreamento, mas não tenho certeza de qualquer outra maneira de contornar isso.
Alguém tem boas sugestões para mim aqui? :)
EDITAR - OK, então eu preciso atualizar minhas ligações, que ainda não funcionam bem:
<ToggleButton Tag="1" Command="{Binding MyCommand}" Style="{StaticResource PassFailToggleButtonStyle}" HorizontalContentAlignment="Center" Background="Transparent" BorderBrush="Transparent" BorderThickness="0">
<ToggleButton.CommandParameter>
<MultiBinding Converter="{StaticResource MyConverter}">
<MultiBinding.Bindings>
<Binding Path="IsChecked" RelativeSource="{RelativeSource Mode=Self}" />
<Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}" />
</MultiBinding.Bindings>
</MultiBinding>
</ToggleButton.CommandParameter>
</ToggleButton>
Ischeced estava funcionando, mas não tag. Acabei de perceber que a tag é uma string ... duh. Está funcionando agora! A chave era usar uma fonte de Relatives de Auto.
Solução
Como explicado acima, descobri. Eu tive que usar Self
por RelativeSource
E isso fez o truque.