WPF Multibind转换器没有返回值?

时间:2015-03-02 20:28:09

标签: c# wpf xaml converter multibinding

我有一个多绑定调用带有两个绑定的转换器。由于某种原因,它不会返回任何东西。我把

<ItemsControl.Width>
    <MultiBinding Converter="{StaticResource ResourceKey=TimelineWidthConverter}">
        <Binding Path="AnimationManager.MaxFrame" ElementName="UC" />
        <Binding Path="AnimationManager.CurrentZoom" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:TimelineAnimationView}}" />
    </MultiBinding>
</ItemsControl.Width>
在XAML文件中

,转换器显示为:

internal class MaterialTimelineWidthConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values == null || values.Length != 2 || ReferenceEquals(values[0], DependencyProperty.UnsetValue) || ReferenceEquals(values[1], DependencyProperty.UnsetValue))
        {
            return 240;
        }

        var maxFrame = System.Convert.ToInt32(values[0]);
        var currentZoom = System.Convert.ToInt32(values[1]);

        return currentZoom*maxFrame;

    }

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

奇怪的是,如果我将XAML文件更改为:

<ItemsControl.Width>
    280
</ItemsControl.Width>

它有效,但如果我只是在转换器中返回280,它就不会做任何事情。它似乎只返回任何东西,但它没有给出任何错误。

之前转换器工作时,它只是一个单值转换器(传统绑定,没有多重绑定),但只要我添加第二个属性并使其成为多个就不起作用。有什么提示吗?

2 个答案:

答案 0 :(得分:2)

多值转换器返回的值必须与目标属性的类型完全匹配。因此,它必须返回double值,而不是int

您还必须正确转换两个输入值。您当前的代码假定AnimationManager类的MaxFrameCurrentZoom属性都是int类型。如果它们实际上是double s,请相应地更改转换。

public object Convert(
    object[] values, Type targetType, object parameter, CultureInfo culture)
{
    if (values == null || values.Length != 2 ||
        ReferenceEquals(values[0], DependencyProperty.UnsetValue) ||
        ReferenceEquals(values[1], DependencyProperty.UnsetValue))
    {
        return 240d;
    }

    var maxFrame = System.Convert.ToInt32(values[0]); // or ToDouble
    var currentZoom = System.Convert.ToInt32(values[1]); // or ToDouble
    return (double)(currentZoom * maxFrame);
}

可能更好的实现可能会检查输入值是否实际为整数或双精度(因此也无法检查UnsetValue):

public object Convert(
    object[] values, Type targetType, object parameter, CultureInfo culture)
{
    double result = 240d;

    if (values != null && values.Length == 2 &&
        values[0] is int && values[1] is int)
    {
        var maxFrame = (int)values[0];
        var currentZoom = (int)values[1];
        result = (double)(currentZoom * maxFrame);
    }

    return result;
}

答案 1 :(得分:1)

您正在尝试将double转换为int

...
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{

    if (values == null || values.Length != 2 || values.Any(v => DependencyProperty.UnsetValue.Equals(v)))
        return 240d;

    return values.Cast<double>().Aggregate((v1, v2) => v1 * v2);
}
...