He separado en dos convertidores para la visibilidad, uno basado en si el campo ha sido actualizado y basado en si un campo se le permite ser visto. Yo uso el updatedField uno para cada elemento de texto en mi página para que una estrella se muestra junto a un campo actualizado. Pero algunos elementos de texto sólo son visibles para algunos usuarios, basados en 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 permisos de los campos necesarios que necesita para ejecutar ambos convertidores para determinar si la estrella de la muestra. Es allí una manera de hacer un booleano «Y» los resultados de los dos convertidores?

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

——-Actualización——–

También traté de 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 se entra en el convertidor de ambos valores son «DependencyProperty.UnsetValue». Así que estoy haciendo parecer algo mal aquí.

——–Solución———

He tenido que modificar para esto, pero luego se trabajó.

<Image.Visibility>
    <MultiBinding Converter="{StaticResource combinedVisibilityConverter}" ConverterParameter="FieldToTest">
        <Binding Source="{StaticResource allowedFieldsModel}" Path="Some_Text_Field" />
        <Binding Path="MyObject.UpdatedFields" />
    </MultiBinding>
</Image.Visibility>
InformationsquelleAutor Bill | 2011-06-28

4 Comentarios

  1. 56

    Usted 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();
        }
    }
    • He intentado eso con suerte, ver arriba actualización
    • He dado un ejemplo. Esto funciona en MI máquina =) Tu caso parece ser más complicado que eso, pero a lo mejor ayuda.
    • Casi trabajó para mí, pero como usted dijo, en mi caso fue un poco más complicado. He publicado mi la solución anterior. Gracias por tu ayuda.
  2. 21

    Tarde a la fiesta aquí, pero una solución más fácil es simplemente envuelva el control en otro control. Yo prefiero esto a tener un montón de Convertidores que hacer cosas diferentes.

    <Border Visibility="{Binding Value1, Converter={convertersDF:Converter_ValueToVisibility}}">
     <ComboBox Visibility="{Binding Value2, Converter={convertersDF:Converter_ValueToVisibility}}"/>
    </Border>
    • Briliant! No hay necesidad de escribir la clase extra para una cosa tan simple!
    • De WPF chat – el consenso es que las fronteras son la forma más barata de hacer algo como esto (en lugar de un StackPanel).
    • Traté de editar esto para ayudar a todos pero fue rechazado porque la gente en este sitio son estúpidos
  3. 3

    Una cosa que me vino a la mente es, tal vez, en lugar de dos diferentes campos booleanos, un solo campo de bits creado por junta tórica juntas updatedField y allowedField. Entonces usted puede tener tres de valor de los convertidores, todos los que operan en el mismo campo.

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

    • Puedes dar más detalles sobre esto? No entiendo cómo lo haría en el xaml.
    • De no hacerlo en absoluto en el xaml.
  4. 0

    Usted podría pasar un array de dos objetos para el convertidor en la ConverterParameter – la construcción de la matriz en XAML.

    • cómo pasar dos objetos en converterparameter en xaml? Me encanta saber que…

Dejar respuesta

Please enter your comment!
Please enter your name here