IT박스

바인딩 변환기

itboxs 2020. 6. 15. 21:59
반응형

바인딩 변환기


나는이 작업을 수행 할 수있는 방법이 있나요 Style:

<Style TargetType="FrameworkElement">
    <Setter Property="Visibility">
        <Setter.Value>
            <Binding Path="Tag"
                RelativeSource="{RelativeSource AncestorType=UserControl}"
                Converter="{StaticResource AccessLevelToVisibilityConverter}"
                ConverterParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag}" />                        
        </Setter.Value>
    </Setter>
</Style>

Tag최상위 상위 부모와 Tag제어 자체를 변환기 클래스 로 보내면 됩니다.


ConverterParameter는 종속성 속성이 아니기 때문에 속성은 바인딩 할 수 없습니다.

이후 Binding로부터 유도되지 않는 DependencyObject속성 중에 종속성 속성 일 수있다. 결과적으로 바인딩은 다른 바인딩의 대상 객체가 될 수 없습니다.

그러나 다른 해결책이 있습니다. 일반 바인딩 대신 다중 값 변환기MultiBinding 와 함께 a를 사용할 수 있습니다 .

<Style TargetType="FrameworkElement">
    <Setter Property="Visibility">
        <Setter.Value>
            <MultiBinding Converter="{StaticResource AccessLevelToVisibilityConverter}">
                <Binding Path="Tag" RelativeSource="{RelativeSource Mode=FindAncestor,
                                                     AncestorType=UserControl}"/>
                <Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}"/>
            </MultiBinding>
        </Setter.Value>
    </Setter>
</Style>

다중 값 변환기는 소스 값 배열을 입력으로 가져옵니다.

public class AccessLevelToVisibilityConverter : IMultiValueConverter
{
    public object Convert(
        object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values.All(v => (v is bool && (bool)v))
            ? Visibility.Visible
            : Visibility.Hidden;
    }

    public object[] ConvertBack(
        object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

때문에 아니, 불행하게도이 할 수 없습니다 ConverterParameter하지 않는 것입니다 DependencyProperty당신이 바인딩을 사용할 수 없습니다 있도록

그러나 아마도 속임수를 사용하여 MultiBindingwith IMultiValueConverter2 Tag속성 을 전달할 수 있습니다.


변환기 매개 변수에 바인딩을 사용하기 위해 MarkupExtension을 사용하는 다른 방법도 있습니다. 이 솔루션을 사용하면 첫 번째 샘플에서 예상 한 것처럼 ConverterParameter가 IValueConverter로 전달되므로 IMultiValueConverter 대신 기본 IValueConverter를 계속 사용할 수 있습니다.

재사용 가능한 MarkupExtension은 다음과 같습니다.

/// <summary>
///     <example>
///         <TextBox>
///             <TextBox.Text>
///                 <wpfAdditions:ConverterBindableParameter Binding="{Binding FirstName}"
///                     Converter="{StaticResource TestValueConverter}"
///                     ConverterParameterBinding="{Binding ConcatSign}" />
///             </TextBox.Text>
///         </TextBox>
///     </example>
/// </summary>
public class ConverterBindableParameter : MarkupExtension
{
    #region Public Properties

    public Binding Binding { get; set; }

    public IValueConverter Converter { get; set; }

    public Binding ConverterParameterBinding { get; set; }

    #endregion

    #region Overridden Methods

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var multiBinding = new MultiBinding();
        multiBinding.Bindings.Add(Binding);
        multiBinding.Bindings.Add(ConverterParameterBinding);
        var adapter = new MultiValueConverterAdapter
                      {
                          Converter = Converter
                      };
        multiBinding.Converter = adapter;
        return multiBinding.ProvideValue(serviceProvider);
    }

    #endregion
}

코드베이스에서이 확장을 사용하면 다음과 같은 방법으로 변환기 매개 변수를 바인드 할 수 있습니다.

<Style TargetType="FrameworkElement">
<Setter Property="Visibility">
    <Setter.Value>
     <wpfAdditions:ConverterBindableParameter Binding="{Binding Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}"
                 Converter="{StaticResource AccessLevelToVisibilityConverter}"
                 ConverterParameterBinding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Tag}" />          
    </Setter.Value>
</Setter>

Wich는 초기 제안과 거의 같습니다.

참고 URL : https://stackoverflow.com/questions/15309008/binding-converterparameter

반응형