web-dev-qa-db-fra.com

Liaison XAML à un convertisseur

ce que j'essaie de faire est relativement simple. J'essaie simplement de lier l'élément Y d'un TranslateTransform sur une ellipse à la moitié de sa hauteur:

    <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>

J'ai aussi le convertisseur suivant:

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;
    }
}

Je reçois une erreur sur la ligne XAML où j'utilise réellement le convertisseur. L'erreur est 

'La propriété Set ' System.Windows.Data.Binding.Converter ' A levé une exception.' Numéro de ligne '22' Et position de la ligne '8'.

Quelqu'un peut-il nous éclairer sur la manière de procéder? EDIT: Oui, j'ai le convertisseur ajouté en tant que ressource.

11
Adam S

Il y a 2 problèmes avec votre code

1) votre convertisseur doit être accessible à l'aide de la déclaration StaticResource

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

2) Votre paramètre de convertisseur est une chaîne par défaut, vous devez donc le convertir en 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;
}
15
Dean Chalk

Vous devez ajouter le convertisseur aux ressources

Modifier
Vous devez également ajouter l'espace de noms 

    xmlns:c="clr-namespace:WpfApplication1"

fin éditer

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

Ensuite, vous pouvez utiliser l'instance à partir des ressources

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

Le paramètre est probablement passé sous forme de chaîne. Définissez un point d'arrêt dans votre convertisseur et examinez les valeurs de value et parameter. Vous devrez peut-être utiliser double.Parse au lieu de la distribution.

0
Jens