web-dev-qa-db-ja.com

ブール型&& 2つの可視性コンバーターの方法

可視性のための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>
33
Bill

短い手作りの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();
    }
}
56
Jens

ここではパーティーに遅れていますが、簡単な解決策は、コントロールを別のコントロールにラップすることです。私はこれを、さまざまなことを行う多くのコンバーターを持つよりも好みます。

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

思い浮かんだことの1つは、おそらく、2つの異なるブールフィールドの代わりに、updatedFieldとallowedFieldの論理和をとることによって作成された単一ビットフィールドです。その後、3つの値コンバーターを使用して、すべて同じフィールドで操作できます。

または、データモデルでANDを実行する別のフィールドを計算します。それはおそらく(実行時間の点で)より効率的です。

3
i_am_jorf

2つのオブジェクトの配列をConverterParameterのコンバーターに渡すことができます-XAMLで配列を作成します。

0