如何布尔&&两个可见性转换器

Bil*_*ill 33 data-binding wpf converter

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

例如:

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

<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}}" />
Run Code Online (Sandbox Code Playgroud)

我的问题是,对于需要许可的字段,我需要运行两个转换器来确定星是否出现.有没有办法在两个转换器的结果上做一个布尔"And"?

我查看了这篇文章,但它似乎不允许将不同的参数集传递给两个不同的转换器.

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

我还试图用这个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>
Run Code Online (Sandbox Code Playgroud)

但是当它进入转换器时,两个值都是"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>
Run Code Online (Sandbox Code Playgroud)

Jen*_*ens 56

您可以将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>
Run Code Online (Sandbox Code Playgroud)

......和转换器......

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Ash*_*heh 22

迟到这里的聚会,但更简单的解决方案是将控件包装在另一个控件中.我更喜欢这个让很多转换器做不同的事情.

<Border Visibility="{Binding Value1, Converter={convertersDF:Converter_ValueToVisibility}}">
 <ComboBox Visibility="{Binding Value2, Converter={convertersDF:Converter_ValueToVisibility}}"/>
</Border>
Run Code Online (Sandbox Code Playgroud)

  • 我试图编辑这个以帮助每个人,但它被拒绝,因为这个网站上的人是愚蠢的 (3认同)
  • 从WPF聊天 - 共识是边框是最便宜的方式来做这样的事情(而不是StackPanel). (2认同)