Pergunta

Eu criei um conversor para converter de uma dupla para inteiro.

Mas o "valor de retorno (int);" linha sempre recebe uma "conversão especificada não é válido."

O que eu tenho que fazer para que o meu converte com sucesso um casal e envia de volta um inteiro?

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>
Foi útil?

Solução

Você está tentando elenco (não convertido) a partir de duplo para int, que não vai funcionar. Você precisa fazer uma conversão implícita ou usar Convert.ToInt32 () - uma vez que o argumento é realmente do tipo de objeto Eu acho que você vai precisar do último para manter o feliz compilador. Cabe a você decidir se deseja incluir provedor de formato da cultura ou não.

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

Você pode usar o operador de conversão quando o objeto de ter a mesma forma , ou seja, quando um objeto é uma instância do tipo ao qual você está lançando. Por exemplo, se a classe Foo estende a classe Bar, em seguida, você pode converter um objeto do tipo Foo digitar Bar - porque um objeto Foo tem todos os métodos e propriedades que um objeto Bar faria. Você não poderia, no entanto, converter um objeto do tipo Bar digitar Foo porque Foo muda (ou pode mudar, tanto quanto o compilador está em causa) a forma de Bar, adicionando métodos ou propriedades que um objeto Bar não tem.

No seu caso, você está lidando com tipos primitivos que só compartilham a interface de objetos - não há uma relação de herança entre eles, exceto que eles derivam de objeto. Há, no entanto, um implícito conversão entre os dois. Você pode atribuir um tipo de um objeto para uma variável do outro, embora você pode perder alguma precisão no 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

Você não pode, no entanto, converter um objeto de um tipo para outro. Fundição implica que você estará usando o objeto como se fosse de outro tipo. Neste caso, o formas diferentes e isso não pode ser feito.

Outras dicas

O problema é que você está tentando fazer tanto um unbox e um elenco, ao mesmo tempo. Isto irá falhar. Você deve primeiro unbox e depois convertido para o tipo apropriado.

return (int)(double)value;

Eric Lippert recentemente escreveu um belo artigo sobre exatamente por que isso é necessário. Vale a pena ler

O valor double é encaixotado dentro de um objeto, ea única maneira de obtê-lo para fora é unbox-lo como um double. Depois que você pode lançá-lo a um int.

return (int)(double)value;

Você também pode usar o método Convert.ToInt32(object) (como tvanfosson sugerido), que irá converter o objeto para IConvertible e chamá-lo de método ToInt32 virtual, que por sua vez irá chamar o método Convert.ToInt32(double). Isso é, naturalmente, um pouco mais acima.

Você deseja converter, mas você está fazendo fundição de double para int. Tente isto:

    public object Convert(object value, ...)
    {
        return (int)(double)value;
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top