2010-07-05 3 views
1

J'ai 4 boutons dans la grille dont datacontext est défini sur un objet dont la propriété indique quel bouton doit être activé (il est énumérable).Modification de l'apparence de la collection d'éléments en fonction d'une seule propriété dans XAML

Actuellement, j'ai fait cela en code-behind de sorte que lorsque cette propriété spécifique change, elle le désactive tous sauf un en fonction de la valeur. Cela fonctionne, mais je n'aime vraiment pas mettre des trucs comme ça dans le code-behind. Il doit y avoir un moyen de le faire dans xaml? Je pourrais faire un style propre pour les quatre boutons, puis le faire avec des déclencheurs de données, mais je préférerais une approche plus générique: utiliser le même style pour tous les boutons qui s'appliquent d'une manière différente en fonction, par exemple, du nom et de la valeur du bouton de la propriété.

Merci d'avance.

Répondre

1

Vous pouvez utiliser un MultiBinding pour lier la propriété IsEnabled à une combinaison du nom du contrôle et la propriété de votre DataContext et créer un style pour l'appliquer à tous les boutons dans la grille:

<Grid.Resources> 
    <local:EqualsConverter x:Key="EqualsConverter"/> 
    <Style TargetType="Button"> 
     <Setter Property="IsEnabled"> 
      <Setter.Value> 
       <MultiBinding Converter="{StaticResource EqualsConverter}"> 
        <Binding RelativeSource="{RelativeSource Self}" Path="Name"/> 
        <Binding Path="EnabledButtonName"/> 
       </MultiBinding> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Grid.Resources> 

Et dans le code:

public class EqualsConverter 
    : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return values.Length == 2 && object.Equals(values[0], values[1]); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 
+0

Woah. Ceci est exactement ce que je cherchais. Merci! – Juha

1

vous pouvez créer une association entre la enum que vous avez créé et les boutons en ayant des références entières à vos valeurs enum et en donnant ces valeurs ENUM ConverterParameters pour les boutons correspondants.

Pour exemple:

ENUM:

public enum myOptions 
{ 
    value1 = 1, 
    value2 = 2, 
    value3 = 3, 
    value4 = 4 
} 

La Reliure:

<Button IsEnabled = {Binding Path=myProperty, 
          Converter = {StaticResource EnumToBoolConverter}, 
          ConverterParameter = 1} /> 
<Button IsEnabled = {Binding Path=myProperty, 
          Converter = {StaticResource EnumToBoolConverter}, 
          ConverterParameter = 2} /> 

et le convertisseur:

public class EnumToBoolConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (int)value == (int)parameter; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
} 
Questions connexes