这是对Town's answer的另一种扩展。根据我的特定需求,我需要传递特定类型的参数,而像Trevi's answer这样基于字符串的解决方案不支持此功能。
我的解决方案需要一些冗长,但作为XAML用户,我们对此并不陌生 ;)
public class ValueConverterChainParameters : List<object>
{
}
public class ValueConverterChain : List<IValueConverter>, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (parameter is not (null or ValueConverterChainParameters))
{
throw new ApplicationException($"{nameof(ValueConverterChain)} parameter must be empty/null or a {nameof(ValueConverterChainParameters)} instance where each element is the parameter to pass to the corresponding converter.");
}
ValueConverterChainParameters parameterList = parameter as ValueConverterChainParameters;
return this
.Select((converter, index) => (converter, index))
.Aggregate(value, (currentValue, element) =>
{
(IValueConverter converter, int index) = element;
return converter.Convert(currentValue, targetType, parameterList?[index], culture);
});
}
以下是用法。在这种情况下(我知道有点牵强),模板父级上的属性MyAngle
因某种原因是一个字符串。更改类型转换器只需执行return System.Convert.ChangeType(value, targetType);
以获取期望在Angle
属性上使用的double类型。然后将其传递给我的乘法转换器,该转换器将使用参数进行乘法运算。
<RotateTransform >
<RotateTransform.Angle>
<Binding Path="MyAngle" RelativeSource="{RelativeSource TemplatedParent}">
<Binding.Converter>
<conv:ValueConverterChain>
<conv:ChangeTypeConverter/>
<conv:MultiplyConverter/>
</conv:ValueConverterChain>
</Binding.Converter>
<Binding.ConverterParameter>
<conv:ValueConverterChainParameters>
<x:Null/>
<sys:Int32>-1</sys:Int32>
</conv:ValueConverterChainParameters>
</Binding.ConverterParameter>
</Binding>
</RotateTransform.Angle>
</RotateTransform>
是的,它有点冗长,但支持在不想传递参数和传递特定类型参数时传递null
。
return this.Reverse<IValueConverter>().Aggregate(value, (current, converter) => converter.ConvertBack(current, targetType, parameter, culture));
。 - Nick Udell