Question

J'ai créé un convertisseur pour convertir de double en entier.

Mais la ligne "retour (int) valeur;" toujours obtient un « cast spécifié est incorrect. »

Que dois-je faire pour que mon Converter convertit avec succès un double et renvoie un entier?

Converter:

namespace TestChangeAngle
{
    [ValueConversion(typeof(double), typeof(int))]
    class DoubleToIntegerConverter : IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return (int)value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}

XAML:

<Page x:Class="TestChangeAngle.Page1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestChangeAngle"
    Title="Page1">
    <Page.Resources>
        <local:DoubleToIntegerConverter x:Key="DoubleToIntegerConverter"/>
    </Page.Resources>

    <StackPanel HorizontalAlignment="Left" Margin="20">
        <Image Source="images\logo2.png" 
               RenderTransformOrigin="0.5, 0.5"
               Width="100" 
               Margin="10">
            <Image.RenderTransform>
                <RotateTransform Angle="{Binding ElementName=TheSlider, Path=Value}"/>
            </Image.RenderTransform>
        </Image>
        <Slider x:Name="TheSlider"
                Width="200" 
                Minimum="0"
                Maximum="360"
                HorizontalAlignment="Center"
                Margin="10" 
                Cursor="Hand"/>
        <TextBox x:Name="TheAngle"
                 Margin="10"
                 Width="100">
            <TextBox.Text>
                <Binding ElementName="TheSlider"
                         Path="Value"
                         UpdateSourceTrigger="PropertyChanged"
                         Converter="{StaticResource DoubleToIntegerConverter}"
                         Mode="TwoWay">
                    <Binding.ValidationRules>
                        <local:MinMaxValidationRule Minimum="0" Maximum="360"/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>

    </StackPanel>
</Page>
Était-ce utile?

La solution

Vous essayez de lancer (pas convertir) de double en int, qui ne fonctionnera pas. Vous devez faire une Convert.ToInt32 () conversion implicite ou utiliser - puisque l'argument est en fait l'objet de type je pense que vous aurez besoin à ce dernier de garder le compilateur heureux. Il est à vous si vous voulez inclure le fournisseur de format de la culture ou non.

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return Convert.ToInt32(value);
}

Vous pouvez utiliser l'opérateur coulé quand ont de l'objet même forme , qui est, quand un objet est une instance de type auquel vous coulée. Par exemple, si la classe Foo Bar étend la classe, vous pouvez jeter un objet de type Foo au type Bar - parce qu'un objet Foo a toutes les méthodes et propriétés qu'un objet Bar ferait. Vous pouvez cependant pas jeter un objet de type barre de taper Foo parce que les changements Foo (ou peut changer, dans la mesure où le compilateur est concerné) forme de Bar, en ajoutant des méthodes ou des propriétés un objet bar n'a pas.

Dans votre cas, vous avez affaire à des types primitifs qui ne partagent que l'interface objet - il n'y a pas une relation d'héritage entre eux, sauf que les deux dérivent de l'objet. Il y a, cependant, un implicite conversion entre les deux. Vous pouvez assigner un objet d'un type à une variable de l'autre, bien que vous risquez de perdre une certaine précision de la valeur.

double x = 1.1;
int y = 0;

y = x;  // implicit conversion, this works, y will be 1
x = y;  // implicit conversion, this works, x will be 1.0

Vous ne pouvez cependant jeter un objet d'un type à l'autre. Castings implique que vous utiliserez l'objet comme si elle était de l'autre type. Dans ce cas, les formes diffèrent et il ne peut pas faire.

Autres conseils

Le problème est que vous essayez de faire les deux un Unbox et une distribution en même temps. Cela échouera. Vous devez d'abord Unbox puis jeté dans le type approprié.

return (int)(double)value;

Eric Lippert récemment écrit un bel article sur exactement pourquoi cela est nécessaire. Il vaut la lecture

La valeur double est encaissée dans un objet, et la seule façon de le faire sortir est de unbox comme un double. Après cela, vous pouvez jeter un int.

return (int)(double)value;

Vous pouvez également utiliser la méthode Convert.ToInt32(object) (comme suggéré tvanfosson), qui jetteront l'objet à IConvertible et appeler sa méthode de ToInt32 virtuelle, qui à son tour appeler la méthode Convert.ToInt32(double). C'est bien sûr un peu plus au-dessus.

Vous voulez convertir, mais vous faites couler de double en int. Essayez ceci:

    public object Convert(object value, ...)
    {
        return (int)(double)value;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top