Как boolean && два преобразователя видимости
У меня есть два отдельных конвертера для видимости, один из которых основан на обновлении поля и на основании того, разрешено ли поле видеть. Я использую updateField для каждого текстового элемента на моей странице, чтобы звезда появилась рядом с обновленным полем. Но некоторые текстовые элементы видны только некоторым пользователям на основе уровней разрешений.
Например:
<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}}" />
Моя проблема в том, что для случая полей, требующих разрешения, мне нужно запустить оба конвертера, чтобы определить, появляется ли звезда. Есть ли способ сделать логическое "И" по результатам двух преобразователей?
Я просмотрел этот пост, но, похоже, он не позволяет передавать разные параметры параметров в два разных преобразователя.
------- -------- Update
Я также попытался создать MultiValueConverter с помощью этого 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>
Но когда он входит в конвертер, оба значения: "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>
Ответы
Ответ 1
Вы можете использовать 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();
}
}
Ответ 2
Поздно к партии, но проще всего просто обернуть элемент управления в другой элемент управления. Я предпочитаю, чтобы у меня было много конвертеров, которые делают разные вещи.
<StackPanel Visibility="{Binding Value1, Converter={convertersDF:Converter_ValueToVisibility}}">
<ComboBox Visibility="{Binding Value2, Converter={convertersDF:Converter_ValueToVisibility}}"/>
</StackPanel>
Ответ 3
Одна вещь, которая пришла на ум, возможно, вместо двух разных булевых полей, однобитового поля, созданного ORing вместе обновленнымField и allowedField. Затем вы можете иметь три преобразователя значений, все из которых работают в одном и том же поле.
Или просто вычислите другое поле в вашей модели данных, которое там делает ANDING. Это, вероятно, более эффективно (с точки зрения времени выполнения).
Ответ 4
Вы можете передать массив из двух объектов в преобразователь в ConverterParameter
- конструировать массив в XAML.