3 votes

visibilité des lignes de la grille de liaison de données wpf

J'ai une fenêtre avec une grille qui agit comme un formulaire. La fenêtre n'est pas la mienne et il y a une nouvelle exigence pour ne pas afficher (c'est-à-dire réduire) les rangées 4 et 5 en fonction d'un contexte sélectionné par l'utilisateur.

Les deux choses auxquelles je pense pour que ça marche sont soit :

  1. Avoir un convertisseur sur le contenu de la ligne qui prend un bool et réduit la visibilité si vrai.
  2. Avoir un convertisseur sur la propriété de hauteur de ligne de la grille.

Je préfère cette dernière, mais je ne sais pas comment obtenir la valeur d'entrée pour le convertisseur. Le code et la liaison du convertisseur sont ci-dessous.

Quelqu'un peut-il me dire à quoi doit ressembler la reliure pour que cela fonctionne ? Y a-t-il un moyen plus facile de le faire ?

Code du convertisseur

[ValueConversion(typeof(GridLength), typeof(Visibility))]
public class GridLengthToCollapseVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {

        if (value == null || parameter == null) return Binding.DoNothing;

        var result = (GridLength) value;
        bool shouldCollapse;
        Boolean.TryParse(parameter.ToString(), out shouldCollapse);
        return shouldCollapse ? new GridLength() : result;

    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); }
}

La liaison (c'est là que je suis bloqué)

Disons que je veux que la valeur de la hauteur soit de 30, sauf si la propriété ShowLastName liée est vraie. La liaison ci-dessous n'est pas correcte, mais qu'est-ce qui l'est ?

 <RowDefinition Height="{Binding Source=30, Converter={StaticResource GridLengthToCollapseVisibilityConv},ConverterParameter=ShowLastName}" />

Solution de travail

[ValueConversion(typeof(bool), typeof(GridLength))]
public class GridLengthToCollapseVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {

        if (value == null || parameter == null) return Binding.DoNothing;

        bool shouldCollapse;
        Boolean.TryParse(value.ToString(), out shouldCollapse);
        return shouldCollapse 
            ? new GridLength(0) 
            : (GridLength) parameter;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); }

}

    <Grid.Resources>
        <cvt:GridLengthToCollapseVisibilityConverter x:Key="GridLengthToCollapseVisibilityConv" />
        <GridLength x:Key="AutoSize">Auto</GridLength>
        <GridLength x:Key="ErrorLineSize">30</GridLength>
    </Grid.Resources>

    <Grid.RowDefinitions>
        <RowDefinition Height="{StaticResource AutoSize}" />
        <RowDefinition Height="{StaticResource ErrorLineSize}" />
        <RowDefinition Height="{Binding Path=HideLastName, 
            Converter={StaticResource GridLengthToCollapseVisibilityConv},ConverterParameter={StaticResource AutoSize}}" />
        <RowDefinition Height="{Binding Path=HideLastName, 
            Converter={StaticResource GridLengthToCollapseVisibilityConv},ConverterParameter={StaticResource ErrorLineSize}}" />
    </Grid.RowDefinitions>

2voto

Richard L Points 1078

Vous ne pouvez pas lier le ConverterParamater à la base de données : http://social.msdn.microsoft.com/Forums/en/wpf/thread/88a22766-5e6f-4a16-98a6-1ab39877dd09

Pourquoi ne pas changer la valeur et le paramètre si la hauteur est toujours la même :

<RowDefinition Height="{Binding Source=ShowLastName, Converter={StaticResource GridLengthToCollapseVisibilityConv},ConverterParameter=30}" />

Si vous devez lier les deux valeurs aux données, vous pouvez utiliser des liaisons à valeurs multiples : http://msdn.microsoft.com/en-us/library/system.Windows.data.imultivalueconverter.aspx

0voto

Il suffit d'intervertir Binding et Parameter.


Si vous voulez toujours que les deux valeurs soient liées aux données, utilisez MultiBinding, même si votre deuxième valeur est une constante. C'est une astuce, mais c'est le moyen le plus simple de passer une ou plusieurs valeurs supplémentaires dans votre convertisseur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X