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.

Foi útil?

Solução

Como explicado acima, descobri. Eu tive que usar Self por RelativeSource E isso fez o truque.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top