【问题标题】:How to boolean && two visibility converters如何布尔 && 两个可见性转换器
【发布时间】:2011-09-24 00:34:15
【问题描述】:

我有两个单独的可见性转换器,一个基于字段是否已更新,一个基于是否允许查看字段。我为页面上的每个文本项使用 updatedField ,以便在更新的字段旁边显示一个星号。但是根据权限级别,某些文本项仅对某些用户可见。

例如:

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

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

我的问题是,对于需要权限的字段,我需要运行两个转换器以确定星号是否出现。有没有办法对两个转换器的结果进行布尔“与”运算?

我查看了this post,但它似乎不允许将不同的参数集传递给两个不同的转换器。

-------更新--------

我也尝试用这个 xaml 创建一个 MultiValueConverter

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

但是当它进入转换器时,两个值都是“DependencyProperty.UnsetValue”。所以我显然在这里做错了。

--------解决方案------

我不得不对此进行修改,但后来它起作用了。

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

【问题讨论】:

    标签: wpf data-binding converter


    【解决方案1】:

    想到的一件事可能是,而不是两个不同的布尔字段,而是通过将 updatedField 和 allowedField 进行或运算创建的单个位字段。然后你可以有三个值转换器,都在同一个字段上操作。

    或者只是计算数据模型中的另一个字段,在那里执行 ANDing。这可能更有效(就运行时间而言)。

    【讨论】:

    • 您能否提供更多详细信息?我不明白你会如何在 xaml 中做到这一点。
    • 你在 xaml 中根本不这样做。
    【解决方案2】:

    您可以将 MultiBinding 与一个简短的手工制作的 IMultiValueConverter 一起使用。

    示例:

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

    ...和转换器...

    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();
        }
    }
    

    【讨论】:

    • @Psilopz:我举了一个例子。这适用于我的机器 =) 你的情况似乎比这更复杂,但也许它有帮助。
    • 它几乎对我有用,但就像你说的,我的情况有点复杂。我在上面发布了我的解决方案。感谢您的帮助。
    【解决方案3】:

    您可以将包含两个对象的数组传递给 ConverterParameter 中的转换器 - 在 XAML 中构造数组。

    【讨论】:

      【解决方案4】:

      迟到了,但更简单的解决方案是将控件包装在另一个控件中。我更喜欢拥有许多做不同事情的转换器。

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

      【讨论】:

      • 太棒了!这么简单的东西不用写额外的类!
      • 来自 WPF 聊天 - 共识是边框是执行此类操作的最便宜方式(而不是 StackPanel)。
      • 我试图编辑这个来帮助大家,但它被拒绝了,因为这个网站上的人都很愚蠢
      猜你喜欢
      • 2014-03-23
      • 2019-12-18
      • 2013-08-18
      • 2019-01-03
      • 1970-01-01
      • 2014-01-25
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多