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 :
- Avoir un convertisseur sur le contenu de la ligne qui prend un bool et réduit la visibilité si vrai.
- 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>