2010-12-07 34 views
2

j'ai le DataTrigger actuel:WPF - datatriggers d'utilisation répétée

<DataTrigger Binding="{Binding HeaderType}" Value="1"> 
    <Setter Property="BorderThickness" Value="5"/></DataTrigger> 

Je veux faire la même chose avec des valeurs 2-100

Dois-je copier le déclenchement 99 fois plus de données ou peut-être il y a une meilleure façon ?

Répondre

3

Ajouter une propriété à votre modèle de vue:

public bool HasImportantHeader // or something... 
{ 
    get { return HeaderType >=1 && HeaderType <= 100; } 
} 

utilisation que propriété dans le déclenchement de données:

<DataTrigger Binding="{Binding HasImportantHeader}" Value="True"> 
    <Setter Property="BorderThickness" Value="5"/> 
</DataTrigger> 

En général, j'aime que mon XAML soit aussi simple que possible, mettre toute la logique dans le modèle de vue, et éviter d'utiliser les convertisseurs à moins qu'ils ne soient absolument nécessaires.

Disons que vous ajoutez un autre point de vue, où vous voulez utiliser le texte en gras pour indiquer le type d'en-tête est compris entre 1 et 100. Il suffit de réutiliser la propriété HasImportantHeader, quelque chose comme:

<DataTrigger Binding="{Binding HasImportantHeader}" Value="True"> 
    <Setter Property="FontWeight" Value="Bold"/> 
</DataTrigger> 

Plus tard, vous peut décider que tous les types d'en-tête jusqu'à doivent avoir une bordure épaisse et du texte en gras. Ce sera une simple question de changer l'implémentation de la propriété HasImportantHeader.

+0

Belle solution. "Les valeurs sont-elles dans la gamme?" est un état. La vue est pour visualiser des choses, pas pour garder l'état. – rooks

1

Vous devez utiliser un convertisseur à cet effet. Vous pouvez ajouter un convertisseur sur votre DataTrigger. Le convertisseur vous permettra de passer la valeur, et retourner vrai ou faux.

<DataTrigger 
    Binding="{Binding HeaderType, Converter={StaticResource RengeConvertor}}" 
    Value="true" 
    > 
    <Setter Property="BorderThickness" Value="5" /> 
</DataTrigger> 

et votre convertisseur devrait ressembler à

public class RengeConvertor : IValueConverter 

{

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 

{ 

    int data = (int)value; 

    if (data >= 2 && data <= 100) 

     return true; 

    else 

     return false; 

} 

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 

{ 

    throw new NotImplementedException(); 

} 

}

Vous pouvez également trouver cela intéressant http://zamjad.wordpress.com/2010/07/29/range-converter/

+0

Merci biju, je voudrais savoir s'il y a un moyen XAML de le résoudre sans impliquer une nouvelle collection pour le ViewModel et le nouveau convertisseur. (Comment est-ce que Microsoft n'a pas exposé une propriété qui représente l'opérande). – Erez

+0

Je ne pense pas qu'il existe un seul moyen de xaml pour vos besoins. – biju

2

Je avez utilisé ce dans des situations similaires

<DataTrigger Binding="{Binding HeaderType, 
           Converter={StaticResource RangeConverter}, 
           ConverterParameter=1-100}" 
      Value="True"> 
    <Setter Property="BorderThickness" Value="5"/> 
</DataTrigger> 

Et dans le convertisseur on retourne vrai ou faux selon les gammes

public class RangeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string[] ranges = parameter.ToString().Split(new char[]{'-'}); 
     int headerType = (int)value; 
     if (headerType >= System.Convert.ToInt32(ranges[0]) && 
      headerType <= System.Convert.ToInt32(ranges[1])) 
     { 
      return true; 
     } 
     return false; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
}