0

J'ai besoin d'un gestionnaire de commandes pour un ToggleButton qui peut prendre plusieurs paramètres, à savoir la propriété IsChecked de ToggleButton, avec une valeur constante, qui peut être une chaîne, un octet, int ... n'a pas d'importance.Besoin d'aide supplémentaire pour lier plusieurs CommandParameters en utilisant MultiBinding

J'ai trouvé this great question on SO et suivi le lien de la réponse et lu sur MultiBinding et IMultiValueConverter. Il est allé vraiment bien jusqu'à ce que je devais écrire le MultiBinding, quand j'ai réalisé que je dois aussi passer une valeur constante et ne pouvait pas faire quelque chose comme

<Binding Value="1" /> 

je puis suis tombé sur une autre similar question that Kent Boogaart answered, puis j'ai commencé à Pensez à des façons de contourner ce problème.

Une possibilité est de ne pas utiliser MVVM et ajoutez simplement la propriété Tag à mon ToggleButton, dans ce cas, mon MultiBinding ressemblerait à ceci:

<MultiBinding Converter="{StaticResource MyConverter}"> 
    <MultiBinding.Bindings> 
     <Binding Path="IsChecked" /> 
     <Binding Path="Tag" /> 
    </MultiBinding.Bindings> 
</MultiBinding> 

Kent avait fait un commentaire sur les lignes de " Si vous utilisez MVVM, vous devriez pouvoir contourner ce problème ". Cependant, je ne suis pas sûr que ce soit une option pour moi, même si j'ai adopté MVVM comme mon modèle WPF de nécessité choix.

La raison pour laquelle je dis cela est que j'ai plusieurs wayyyy dans le UserControl, et que chacune des commandes de ToggleButtons doit appeler la même fonction. Mais comme ils sont des ToggleButtons, je ne peux pas utiliser la propriété liée à IsChecked dans le ViewModel, car je ne sais pas lequel a été cliqué en dernier. Je suppose que je pourrais ajouter une autre propriété privée pour garder une trace de cela, mais il semble un peu stupide. Pour ce qui est de la constante, je pourrais probablement m'en débarrasser si je faisais l'idée du pistage, mais je ne suis pas sûr d'un autre moyen de contourner ce problème.

Est-ce que quelqu'un a de bonnes suggestions pour moi ici? :)

EDIT - ok, donc je dois mettre à jour mes fixations qui ne fonctionnent toujours pas tout à fait raison:

<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> 

IsChecked travaillait, mais pas Tag. Je viens de réaliser que Tag est une chaîne ... Ça marche maintenant! La clé était d'utiliser un RelativeSource de Self.

+0

Ma liaison ci-dessus est erronée, car elle interroge la machine virtuelle. Tout le monde a des conseils, ou pouvez-vous recommander une bonne «feuille de triche» en ligne pour déterminer les chemins de liaison de données? Je regarde habituellement la fenêtre de sortie pour les erreurs pour voir à quoi il se lie. À l'heure actuelle, je pense que je dois définir l'attribut RelativeSource, mais je ne l'ai jamais utilisé auparavant. – Dave

+0

ok, j'ai trouvé ceci: http://stackoverflow.com/questions/84278/how-do-i-use-wpf-bindings-with-relativesource – Dave

+0

Astuce possible pour la liaison à une constante: utiliser une ressource. ' 1' dans votre section Ressources, puis '{Binding Source =" {StaticResource One} "}'. Totalement non testé cependant. – itowlson

Répondre

0

Comme expliqué ci-dessus, je l'ai compris. J'ai dû utiliser Self pour RelativeSource et cela a fait l'affaire.