可視性のための2つの個別のコンバーターがあります。1つはフィールドが更新されたかどうかに基づいており、もう1つはフィールドの表示が許可されているかどうかに基づいています。更新されたフィールドの横に星が表示されるように、ページ上の各テキスト項目に対して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}}" />
私の問題は、許可が必要なフィールドの場合、スターが表示されるかどうかを判断するために両方のコンバーターを実行する必要があることです。 2つのコンバーターの結果に対してブール値の "And"を実行する方法はありますか?
この投稿 を見ましたが、異なるパラメーターセットを2つの異なるコンバーターに渡すことができないようです。
- - - -更新 - - - -
また、この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>
短い手作りのIMultiValueConverterとともにMultiBindingを使用できます。
例:
<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>
思い浮かんだことの1つは、おそらく、2つの異なるブールフィールドの代わりに、updatedFieldとallowedFieldの論理和をとることによって作成された単一ビットフィールドです。その後、3つの値コンバーターを使用して、すべて同じフィールドで操作できます。
または、データモデルでANDを実行する別のフィールドを計算します。それはおそらく(実行時間の点で)より効率的です。
2つのオブジェクトの配列をConverterParameter
のコンバーターに渡すことができます-XAMLで配列を作成します。