有没有办法我可以这样做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属性.
还有一种使用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)
威奇看上去几乎像您的最初建议