XAML Привязка к конвертеру - PullRequest
11 голосов
/ 23 ноября 2010

То, что я пытаюсь сделать, относительно просто. Я просто пытаюсь связать Y-элемент TranslateTransform на эллипсе до 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 ]

16 голосов
/ 23 ноября 2010

В вашем коде есть две ошибки

1) к вашему конвертеру нужно обращаться, используя объявление StaticResource

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

2) По умолчанию ваш параметр конвертера является строкой, поэтому вам нужно конвертировать его в двойное число

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;
}
16 голосов
/ 23 ноября 2010

Вам необходимо добавить конвертер в ресурсы

Редактировать
Вам тоже нужно добавить пространство имен

    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>
0 голосов
/ 23 ноября 2010

Параметр, вероятно, передается в виде строки.Установите точку останова в конвертере и посмотрите значения value и parameter.Возможно, вам придется использовать double.Parse вместо приведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...