programing

부울 및 두 개의 가시성 변환기를 사용하는 방법

topblog 2023. 4. 28. 20:00
반응형

부울 및 두 개의 가시성 변환기를 사용하는 방법

하나는 필드가 업데이트되었는지 여부를 기준으로 하고 다른 하나는 필드를 볼 수 있는지 여부를 기준으로 하는 두 개의 별도 변환기가 있습니다.업데이트된 필드 옆에 별표가 나타나도록 페이지의 각 텍스트 항목에 대해 업데이트된 필드 하나를 사용합니다.그러나 일부 텍스트 항목은 권한 수준에 따라 일부 사용자만 볼 수 있습니다.

예:

<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"를 수행할 수 있는 방법이 있습니까?

는 이 게시물을 보았지만 두 개의 서로 다른 변환기에 서로 다른 매개 변수 집합이 전달되는 것을 허용하지 않는 것 같습니다.

-------업데이트-------

저는 또한 이 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>

그러나 변환기에 들어가면 두 값 모두 "Dependency Property"가 됩니다.값을 설정 취소합니다.그래서 제가 여기서 뭔가 잘못하고 있는 것 같습니다.

------솔루션---------

저는 이것을 수정해야 했지만, 그 후 효과가 있었습니다.

<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>

한 가지 생각나는 것은 아마도 두 개의 다른 부울 필드 대신 updateField와 allowedField를 함께 ORing하여 만든 단일 비트 필드입니다.그러면 세 개의 값 변환기가 모두 동일한 필드에서 작동할 수 있습니다.

또는 데이터 모델에서 AND를 수행하는 다른 필드를 계산합니다.런타임 측면에서 볼 때 아마도 더 효율적일 것입니다.

두 개체의 배열을 변환기에 전달할 수 있습니다.ConverterParameterXAML에서 어레이를 구성합니다.

언급URL : https://stackoverflow.com/questions/6501970/how-to-boolean-two-visibility-converters

반응형