Pregunta

I creado un convertidor para convertir de doble a número entero.

Sin embargo, el "valor de retorno (int);" línea Siempre consigue un "fundido especificado no es válido."

¿Qué tengo que hacer para que mi convertidor convierte un doble y devuelve un entero?

convertidor:

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>
¿Fue útil?

Solución

Está intentando fundido (no convertir) de doble a int, que no va a funcionar. Es necesario hacer una conversión implícita o utilizar Convert.ToInt32 () - ya que el argumento es en realidad del tipo de objeto que creo que necesita este último para mantener el compilador feliz. Es hasta usted si desea incluir proveedor de formato de la cultura o no.

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

Puede utilizar el operador de conversión cuando el objeto de la misma tienen forma , es decir, cuando un objeto es una instancia de la clase a la que está lanzando. Por ejemplo, si se extiende la clase Foo Bar clase, entonces se puede lanzar un objeto de tipo Foo para escribir Bar - ya que un objeto Foo tiene todos los métodos y propiedades que un objeto Bar haría. No se podía, sin embargo, lanzar un objeto de tipo barra para escribir Foo Foo porque cambia (o puede cambiar, por lo que el compilador se refiere) la forma de la barra, mediante la adición de métodos o propiedades que un objeto de barra no tiene.

En su caso se trata de tipos primitivos que sólo comparten la interfaz de objetos - no hay una relación de herencia entre ellos, excepto que ambos derivan del objeto. Hay, sin embargo, un implícito conversión entre los dos. Puede asignar un objeto de un tipo a una variable de la otra, aunque es posible que pierda un poco de precisión en el valor.

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

Puede, sin embargo, convertir un objeto de un tipo a otro. De fundición implica que va a utilizar el objeto como si se tratara de otro tipo. En este caso las formas son diferentes y no se pueden hacer.

Otros consejos

El problema es que usted está tratando de hacer tanto una unbox y un elenco al mismo tiempo. Esto se producirá un error. Primero debe unbox y luego se convierte en el tipo apropiado.

return (int)(double)value;

Eric Lippert Recientemente escribió un buen artículo sobre exactamente por qué esto es necesario. Vale la pena la lectura

El valor double está encajonado dentro de un objeto, y la única manera de conseguirlo es a cabo a desempacar como un double. Después de que se puede echar a un int.

return (int)(double)value;

También puede utilizar el método Convert.ToInt32(object) (como se sugirió tvanfosson), que será lanzado el objeto a IConvertible y llamar a su método ToInt32 virtual, que a su vez llama al método Convert.ToInt32(double). Eso es, por supuesto, un poco más arriba.

Se desea convertir, sino que está haciendo la colada de doble a int. Prueba esto:

    public object Convert(object value, ...)
    {
        return (int)(double)value;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top