我有两个独立的可见性转换器,一个基于字段是否已更新,另一个基于是否允许查看字段。我对我页面上的每个文本项使用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}}" />
我的问题是,对于需要许可的字段,我需要运行两个转换器来确定星是否出现。有没有办法在两个转换器的结果上做一个布尔“And”?
我查看了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>
您可以将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();
}
}
迟到这里的派对,但更简单的解决方案是将控件包装在另一个控件中。我更喜欢这个让很多转换器做不同的事情。
<Border Visibility="{Binding Value1, Converter={convertersDF:Converter_ValueToVisibility}}">
<ComboBox Visibility="{Binding Value2, Converter={convertersDF:Converter_ValueToVisibility}}"/>
</Border>
想到的一件事可能是,而不是两个不同的布尔字段,通过ORing将updatedField和allowedField一起创建的单个位字段。然后你可以有三个值转换器,它们都在同一个字段上运行。
或者只计算数据模型中另一个在那里进行AND运算的字段。这可能更有效(就运行时而言)。
您可以将两个对象的数组传递给ConverterParameter
中的转换器 - 在XAML中构造数组。