web-dev-qa-db-fra.com

Comment booléen && deux convertisseurs de visibilité

J'ai deux convertisseurs distincts pour la visibilité, l'un basé sur si un champ a été mis à jour et l'autre sur si un champ est autorisé à être vu. J'utilise le updatedField un pour chaque élément de texte sur ma page afin qu'une étoile apparaisse à côté d'un champ mis à jour. Toutefois, certains éléments de texte ne sont visibles que par certains utilisateurs en fonction des niveaux d’autorisation.

Par exemple:

<Image Visibility="{Binding ElementName=MyObject, Path=UpdatedFields, Mode=OneWay, Converter={StaticResource updatedFieldConverter}, ConverterParameter=FieldToTest}" Source="Properties:Resources.star_yellow" />

et 

<TextBlock FontSize="21" Foreground="{DynamicResource LabelBrush}" Text="{x:Static Properties:Resources.Some_Text}" Visibility="{Binding Source={StaticResource allowedFields}, Path=Some_Text_Field, Converter={StaticResource visibilityConverter}}" />

Mon problème est que, dans le cas des champs nécessitant une autorisation, je dois exécuter les deux convertisseurs pour déterminer si l'étoile apparaît. Y at-il un moyen de faire un "Et" booléen sur les résultats de deux convertisseurs?

J'ai regardé cet article mais il ne semble pas permettre de transmettre différents ensembles de paramètres aux deux convertisseurs différents.

-------Mettre à jour--------

J'ai aussi essayé de créer un MultiValueConverter avec ce xaml

<Image Grid.Row="4" Grid.Column="0" Source="star_yellow.png">
   <Image.Visibility>
      <MultiBinding Converter="{StaticResource combinedVisibilityConverter}" ConverterParameter="FieldToTest" >
         <Binding ElementName="allowedFieldsModel" Path="Some_Text_Field" Mode="OneWay" />                        
         <Binding ElementName="MyObject" Path="UpdatedFields" Mode="OneWay" />
      </MultiBinding>
   </Image.Visibility>
</Image>

Mais quand il entre dans le convertisseur, les deux valeurs sont "DependencyProperty.UnsetValue". Donc, apparemment, je fais quelque chose de mal ici.

--------Solution---------

J'ai dû modifier cela, mais cela a fonctionné.

<Image.Visibility>
    <MultiBinding Converter="{StaticResource combinedVisibilityConverter}" ConverterParameter="FieldToTest">
        <Binding Source="{StaticResource allowedFieldsModel}" Path="Some_Text_Field" />
        <Binding Path="MyObject.UpdatedFields" />
    </MultiBinding>
</Image.Visibility>
32
Bill

Vous pouvez utiliser une liaison multiple avec un convertisseur IMultiValueConverter court et fabriqué à la main.

Exemple:

<StackPanel>
    <StackPanel.Resources>
        <local:MultiBooleanToVisibilityConverter x:Key="Converter" />
    </StackPanel.Resources>
    <CheckBox x:Name="Box1" />
    <CheckBox x:Name="Box2" />
    <TextBlock Text="Hidden Text">
        <TextBlock.Visibility>
            <MultiBinding Converter="{StaticResource Converter}">
                <Binding ElementName="Box1"
                            Path="IsChecked" />
                <Binding ElementName="Box2"
                            Path="IsChecked" />
            </MultiBinding>
        </TextBlock.Visibility>
    </TextBlock>                   
</StackPanel>

... et le convertisseur ...

class MultiBooleanToVisibilityConverter : IMultiValueConverter
{
    public object Convert(object[] values,
                            Type targetType,
                            object parameter,
                            System.Globalization.CultureInfo culture)
    {
        bool visible = true;
        foreach (object value in values)
            if (value is bool)
                visible = visible && (bool)value;

        if (visible)
            return System.Windows.Visibility.Visible;
        else
            return System.Windows.Visibility.Hidden;
    }

    public object[] ConvertBack(object value,
                                Type[] targetTypes,
                                object parameter,
                                System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
56
Jens

En retard pour le parti ici, mais une solution plus facile consiste à envelopper le contrôle dans un autre contrôle. Je préfère cela à beaucoup de convertisseurs qui font des choses différentes. 

<Border Visibility="{Binding Value1, Converter={convertersDF:Converter_ValueToVisibility}}">
 <ComboBox Visibility="{Binding Value2, Converter={convertersDF:Converter_ValueToVisibility}}"/>
</Border>
19
Asheh

Une chose qui m'est venue à l'esprit est peut-être qu'au lieu de deux champs booléens différents, un seul champ de bits créé par OR, en même temps que updatedField et allowedField. Ensuite, vous pouvez avoir trois convertisseurs de valeur, fonctionnant tous sur le même champ.

Ou calculez simplement un autre champ dans votre modèle de données qui fait le AND ici. C'est probablement plus efficace (en termes d'exécution).

3
i_am_jorf

Vous pouvez transmettre un tableau de deux objets au convertisseur dans ConverterParameter - construire le tableau en XAML.

0
Kieren Johnstone