2010-05-14 13 views
1

Je vais commencer et dire que je n'utilise pas le modèle MVVM pour mon application WPF. S'il vous plaît, pardonnez-moi.un convertisseur sélectif de liaison de commande double dans WPF?

À l'heure actuelle, j'ai un modèle de données avec deux boutons, chacun se lie à une commande différente sur l'objet CLR que ce modèle de données représente. Les deux utilisent le même paramètre de commande. Voici un exemple des boutons.

<Button x:Name="Button1" 
     Command="{Binding Path=Command1}" 
     CommandParameter="{Binding Path=Text, ElementName=TextBox1}" 
/> 
<Button x:Name="Button2" 
     Command="{Binding Path=Command2}" 
     CommandParameter="{Binding Path=Text, ElementName=TextBox1}" 
/> 

Je voudrais factoriser cela en un seul bouton qui peut effectuer deux commandes en fonction d'un paramètre utilisateur comme un booléen dans Settings.settings. Je n'ai pas accès à la refactorisation de l'objet CLR lui-même. Aussi, il s'agit d'un modèle de données, il n'y a pas de codebehind pour moi de travailler avec. Mon avis est qu'un convertisseur serait le meilleur pari, mais je ne sais pas comment je pourrais le mettre ensemble.

Le convertisseur doit prendre en paramètre CommandParameter, ainsi que le DataContext pour qu'il sache sur quel objet exécuter les commandes.

Quelqu'un peut-il me donner un coup de main avec ça? Merci d'avance.

Répondre

4

Solution rapide et sale - placez les deux boutons sur le formulaire et liez leurs visibilités à la valeur de la bool (une négation, évidemment) - de cette façon, seul le bouton valide sera affiché. Si vous voulez utiliser un convertisseur, cependant, je serais enclin à l'utiliser sur la liaison de commande, transmettre l'objet CLR et la valeur de bool et lui permettre de renvoyer la bonne commande à lier à . Je ne vois aucune raison de passer dans le paramètre de commande puisque ce sera la même chose de toute façon.

XAML:

<Resources> 
    <controls:CommandConverter x:Key="CommandConverter"/> 
</Resources> 

<Button x:Name="Button" 
     CommandParameter="{Binding Path=Text, ElementName=TextBox1}"> 
    <Button.Command> 
     <MultiBinding Converter="{StaticResource CommandConverter}"> 
      <MultiBinding.Bindings> 
      <Binding /><-- the datacontext CLR object --> 
      <Binding ... /><-- Application setting (however you intend to get that in) 
      </MultiBinding.Bindings> 
     </MultiBinding> 
    </Button.Command> 
</Button> 

code:

public class CommandConverter : IMultiValueConverter 
{   
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     CommandObject clrObject= (CommandObject)values[0]; 
     bool setting = (bool)values[1]; 

     if (setting) 
     { 
      return clrObject.Command1; 
     } 

     return clrObject.Command2; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

En fait, si le paramètre bool est juste dans les paramètres de l'application que vous pourrait simplement l'utiliser directement dans le convertisseur et utiliser uniquement un convertisseur normal à valeur unique. Ce n'est pas un super design car il devrait vraiment rester seul, mais il fera le travail.

+0

Bien sûr! Je viens d'échouer WPF 101. – Jippers