2013-04-11 2 views
14

Comment envoyer plusieurs paramètres de Button dans WPF? Je suis en mesure d'envoyer un seul paramètre qui est la valeur de TextBox correctement. Voici le code.Paramètres de commande multiples Objet de bouton wpf

XAML

<TextBox Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="133,22,0,0"  Name="textBox1" VerticalAlignment="Top" Width="120" /> 
<Button Content="Button" Grid.Row="1" Height="23" Command="{Binding Path=CommandClick}" CommandParameter="{Binding Text,ElementName=textBox1}" HorizontalAlignment="Left" Margin="133,62,0,0" Name="button1" VerticalAlignment="Top" Width="75" /> 

Code behind

public ICommand CommandClick { get; set; } 

this.CommandClick = new DelegateCommand<object>(AddAccount); 

private void AddAccount(object obj) 
{ 
    //custom logic 
} 
+0

Si vous décrivez quels paramètres précis vous voulez, leurs types, et pourquoi, nous pourrions être en mesure d'aider. Il n'y a qu'une seule "liaison" pour un paramètre de commande, mais il y a d'autres options en fonction de ce dont vous avez besoin, donc plus d'infos s'il vous plaît. –

+0

Vous pouvez transformer plusieurs paramètres en un seul, en utilisant un objet [] (tableau d'objets) par exemple, mais vous devez ensuite convertir tous ces paramètres. Ou y a-t-il un problème avec ça? – Master117

+0

salut J King, ce serait un autre contrôle. une zone de texte peut être une bonne hypothèse. –

Répondre

14

Comment puis-je envoyer plusieurs paramètres à partir bouton WPF.

Vous ne pouvez envoyer qu'un paramètre au format CommandParameter.

Une meilleure solution consiste généralement à lier les TextBox et autres contrôles à plusieurs propriétés dans votre ViewModel. La commande aurait alors accès à toutes ces propriétés (puisque c'est dans la même classe), sans besoin d'un paramètre de commande.

24

Autre que d'utiliser l'approche de définition des propriétés dans votre classe (appelons-la votre ViewModel) pour être lié par votre vue, il y a des moments (pas commun) où nous ne voulons pas le faire, un important L'outil à connaître dans ces situations est le MultiBinding, donc juste pour l'exhaustivité, même si vous êtes satisfait de la première option, je vais couvrir une autre approche.

Pour répondre à votre question:

1. MVVM Approche:

Utilisez l'approche MVVM et définir les propriétés à binded par votre point de vue, et d'utiliser ces propriétés dans votre commande de ViewModel sans avoir besoin de CommandParameters.

2. MultiBinding:(peut vivre heureux avec l'approche MVVM)

utiliser le paramètre de commande en tant que paramètre multi binded comme on le voit ici:

<Button Content="MultiBindingExample" Command="{Binding MyCommand}"> 
    <Button.CommandParameter> 
     <MultiBinding Converter="{StaticResource MyMultiConverter}"> 
      <Binding Path="..." ElementName="MyTextBox"/> 
      <Binding Path="..." ElementName="MySomethingElse"/> 
     </MultiBinding> 
    </Button.CommandParameter> 
</Button> 

Avec votre convertisseur Définie en utilisant la IMultiValueConverter Interface:

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

et pour extraire les valeurs: Il vous suffit de vous référer au paramètre de votre commande Object[] et d'utiliser les paramètres dans le même ordre que dans MultiBinding.

+2

votre convertisseur renvoie des valeurs correctes, mais dans la méthode attachée à la commande relay renvoie un tableau, mais les éléments du tableau sont null. –

+0

Avez-vous défini la ressource statique correctement? S'il vous plaît voir: http://msdn.microsoft.com/en-us/library/windows/apps/hh758287.aspx pour plus d'informations, se concentrer sur l'exemple de la pile, où vous pouvez voir comment définir une ressource statique. –

+0

Je suis confronté au même problème, tout est parfait sauf que les valeurs sont nulles. – Amit