绑定ConverterParameter

dot*_*NET 149 wpf xaml styles

有没有办法我可以这样做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>
Run Code Online (Sandbox Code Playgroud)

我只需要将Tag顶级父级和Tag控件本身发送到我的转换器类.

Cle*_*ens 279

ConverterParameter无法绑定该属性,因为它不是依赖项属性.

由于Binding不是源自DependencyObject它的属性都不能是依赖属性.因此,绑定永远不能成为另一个绑定的目标对象.

然而,有一种替代解决方案.您可以使用MultiBinding带有多值转换器而不是普通绑定:

<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>
Run Code Online (Sandbox Code Playgroud)

多值转换器获取源值数组作为输入:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


sa_*_*213 34

不,不幸的是,这是不可能的,因为ConverterParameter不是,DependencyProperty所以你将无法使用绑定

但也许你可以欺骗并使用MultiBindingwith IMultiValueConverter来传递2个Tag属性.


Pas*_*lsz 6

还有一种使用MarkupExtension的替代方法,以便将绑定用于转换器参数。使用此解决方案,您仍然可以使用默认的IValueConverter而不是IMultiValueConverter,因为ConverterParameter就像在第一个示例中所期望的那样传递到了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
}
Run Code Online (Sandbox Code Playgroud)

在代码库中使用此扩展,您可以简单地通过以下方式绑定Converter参数:

<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>
Run Code Online (Sandbox Code Playgroud)

威奇看上去几乎像您的最初建议

  • 这很有用。但是,缺少“ MultiValueConverterAdapter”。我在[这里](https://www.codeproject.com/Articles/459958/Bindable-Converter-Converter-Parameter-and-StringF)找到了它。 (2认同)