Cómo boolean y dos conversores de visibilidad


Tengo dos convertidores separados para la visibilidad, uno basado en si un campo se ha actualizado y otro basado en si se permite ver un campo. Utilizo updatedField para cada elemento de texto de mi página para que aparezca una estrella junto a un campo actualizado. Pero algunos elementos de texto solo son visibles para algunos usuarios en función de los niveles de permiso.

Por ejemplo:

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

Y

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

Mi problema es que para el caso de los campos requeridos de permiso necesito ejecutar ambos convertidores para determinar si la estrella aparece. ¿Hay una manera de hacer una "Y" booleana en los resultados de dos convertidores?

Miré este post pero no parece permitir que se pasen diferentes conjuntos de parámetros a los dos convertidores diferentes.

-------Actualización--------

También intenté crear un MultiValueConverter con este 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>

Pero cuando entra en el convertidor ambos valores son "DependencyProperty.UnsetValue". Así que aparentemente estoy haciendo algo mal aquí.

--------Solución---------

Tuve que modificar esto, pero luego funcionó.

<Image.Visibility>
    <MultiBinding Converter="{StaticResource combinedVisibilityConverter}" ConverterParameter="FieldToTest">
        <Binding Source="{StaticResource allowedFieldsModel}" Path="Some_Text_Field" />
        <Binding Path="MyObject.UpdatedFields" />
    </MultiBinding>
</Image.Visibility>
Author: Community, 2011-06-28

4 answers

Se podría utilizar un MultiBinding junto con un corto, hecho a mano IMultiValueConverter.

Ejemplo:

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

... y el convertidor ...

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();
    }
}
 54
Author: Jens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-28 08:55:40

Tarde para el partido aquí, pero una solución más fácil es simplemente envolver el control en otro control. Prefiero esto a tener muchos convertidores que hacen cosas diferentes.

<StackPanel Visibility="{Binding Value1, Converter={convertersDF:Converter_ValueToVisibility}}">
 <ComboBox Visibility="{Binding Value2, Converter={convertersDF:Converter_ValueToVisibility}}"/>
</StackPanel>
 15
Author: Asheh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-23 11:15:14

Una cosa que vino a la mente es, tal vez, en lugar de dos campos booleanos diferentes, un solo campo de bits creado orando juntos updatedField y allowedField. Luego puede tener tres convertidores de valor, todos operando en el mismo campo.

O simplemente calcular otro campo en su modelo de datos que hace el ANDing allí. Eso es probablemente más eficiente (en términos de tiempo de ejecución).

 3
Author: i_am_jorf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-28 06:01:06

Puede pasar una matriz de dos objetos al convertidor en el ConverterParameter - construyendo la matriz en XAML.

 0
Author: Kieren Johnstone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-28 08:01:32