wake-up-neo.com

Wie boolean && zwei Sichtbarkeitskonverter

Ich habe zwei separate Konverter für die Sichtbarkeit, einen basierend darauf, ob ein Feld aktualisiert wurde, und einer, der darauf basiert, ob ein Feld sichtbar ist. Ich verwende das aktualisierteField-Feld eins für jedes Textelement auf meiner Seite, sodass ein Stern neben einem aktualisierten Feld angezeigt wird. Einige Textelemente sind jedoch nur für einige Benutzer auf der Grundlage der Berechtigungsstufen sichtbar.

Zum Beispiel:

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

und 

<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}}" />

Mein Problem ist, dass ich im Fall der erlaubnispflichtigen Felder beide Konverter ausführen muss, um festzustellen, ob der Stern angezeigt wird. Gibt es eine Möglichkeit, ein boolesches "Und" zu den Ergebnissen von zwei Konvertern zu machen?

Ich habe diesen Beitrag angeschaut, aber es scheint nicht möglich zu sein, dass verschiedene Parametersätze an die beiden unterschiedlichen Konverter übergeben werden.

-------Aktualisieren--------

Ich habe auch versucht, einen MultiValueConverter mit diesem Xaml zu erstellen

<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>

Wenn der Konverter jedoch eingegeben wird, sind beide Werte "DependencyProperty.UnsetValue". Ich mache anscheinend hier etwas falsch.

--------Lösung---------

Ich musste das ändern, aber dann funktionierte es.

<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

Sie können eine MultiBinding zusammen mit einem kurzen, von Hand hergestellten IMultiValueConverter verwenden.

Beispiel:

<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>

... und der Konverter ...

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

Spät zur Party, aber eine einfachere Lösung besteht darin, das Steuerelement einfach in ein anderes Steuerelement zu packen. Ich ziehe es vor, viele Konverter zu haben, die verschiedene Dinge tun. 

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

Eine Sache, die mir in den Sinn kam, ist vielleicht anstelle von zwei verschiedenen booleschen Feldern ein einzelnes Bitfeld, das durch ODER-Verknüpfung von updatedField und AllowedField erstellt wird. Dann können Sie drei Wertkonverter verwenden, die alle auf demselben Feld arbeiten.

Oder berechnen Sie einfach ein anderes Feld in Ihrem Datenmodell, das die UND-Verknüpfung dort vornimmt. Das ist wahrscheinlich effizienter (in Bezug auf die Laufzeit).

3
i_am_jorf

Sie könnten ein Array aus zwei Objekten an den Konverter in der Variablen ConverterParameter übergeben, um das Array in XAML zu erstellen.

0