XAML绑定到转换器

时间:2010-11-23 07:03:46

标签: c# wpf data-binding

我想做的事情相对简单。我只是试图将椭圆上的TranslateTransform的Y元素绑定到椭圆的高度的1/2:

    <Ellipse Name="EllipseOnlyLFA" Height="200" Fill="Yellow" HorizontalAlignment="Left" VerticalAlignment="Bottom" ClipToBounds="True">
        <Ellipse.Width>
            <Binding ElementName="EllipseOnlyLFA" Path="Height"/>
        </Ellipse.Width>
        <Ellipse.RenderTransform>
            <TranslateTransform>
                <TranslateTransform.Y>
                    <Binding Converter="MultiplyByFactor" ElementName="EllipseOnlyLFA" Path="Height"  ConverterParameter="0.5"/>
                </TranslateTransform.Y>
            </TranslateTransform>
        </Ellipse.RenderTransform>
    </Ellipse>

我还有以下转换器:

public class MultiplyByFactor : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((double)value * (double)parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return true;
    }
}

我在实际使用转换器的XAML线上收到错误。错误是

  

'设置属性   'System.Windows.Data.Binding.Converter'   抛出一个例外。'行号'22'   和行位置'8'。

任何人都可以了解如何做到这一点? 编辑:是的,我已将转换器添加为资源。

3 个答案:

答案 0 :(得分:16)

您需要将转换器添加到资源

修改
您还需要添加命名空间

    xmlns:c="clr-namespace:WpfApplication1"

结束修改

<Window.Resources>
    <c:MultiplyByFactor x:Key="myMultiplyByFactor"/>
</Window.Resources>

然后您可以使用资源中的实例

<TranslateTransform.Y>
    <Binding Converter={StaticResource myMultiplyByFactor}"
        ElementName="EllipseOnlyLFA"
        Path="Height" ConverterParameter="0.5"/>
</TranslateTransform.Y>

答案 1 :(得分:15)

您的代码有两个问题

1)您的转换器需要使用StaticResource声明

进行访问
<Binding Converter="{StaticResource myMultiplyByFactor}" 
    ElementName="EllipseOnlyLFA" Path="Height"  ConverterParameter="0.5"/

2)您的converter参数默认为字符串,因此您需要将其转换为double

public object Convert(object value, Type targetType, 
    object parameter, CultureInfo culture)
{
    double.TryParse((parameter as string).Replace(',', '.'), NumberStyles.Any, CultureInfo.InvariantCulture, out double param);
    return param * (double)value;
}

答案 2 :(得分:0)

参数可能作为String传递。在Converter中设置断点并查看valueparameter的值。您可能需要使用double.Parse而不是强制转换。