Frage

ich einen Konverter von doppelt auf integer zu konvertieren erstellt.

Aber die Zeile "return (int) Wert;" bekommt immer eine „angegebene Umwandlung ungültig ist.“

Was muss ich so tun müssen, dass meine Converter erfolgreich ein Doppel konvertiert und eine ganze Zahl zurückschickt?

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>
War es hilfreich?

Lösung

Sie versuchen (nicht konvertieren) von Doppel zu werfen, in int, die nicht funktionieren. Sie benötigen eine implizite Konvertierung oder verwenden Convert.ToInt32 () zu tun - da das Argument tatsächlich vom Typ Objekt ist, ich glaube, Sie werden die letzteren müssen die Compiler glücklich zu halten. Es liegt an Ihnen, ob Sie die Kultur des Format-Provider enthalten sein sollen oder nicht.

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

Sie können den Cast-Operator verwenden, wenn das Objekt ist das gleiche haben Form , das heißt, wenn ein Objekt eine Instanz des Typs, zu dem Sie Gießen. Zum Beispiel, wenn Klasse Foo Klasse Bar erstreckt, dann kann man ein Objekt vom Typ Foo wirft Bar zu geben - weil ein Foo Objekt verfügt über alle Methoden und Eigenschaften, die ein Bar-Objekt würde. Sie konnten jedoch nicht werfen Bar ein Objekt vom Typ Foo zu geben, weil Foo ändert (oder ändern können, soweit der Compiler betrifft) die Form von Bar, durch Methoden oder Eigenschaften hinzu, dass eine Bar Objekt nicht.

In Ihrem Fall handelt man mit primitiven Typen, die nur die Objektschnittstelle teilen - es gibt keine Vererbungsbeziehung zwischen ihnen, außer dass sie beide aus dem Objekt abzuleiten. Es gibt jedoch eine implizite Umwandlung , um zwischen den beiden. Sie können ein Objekt einen Typ einer Variablen des anderen zuweisen, wenn Sie etwas Präzision im Wert verlieren kann.

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

Sie können jedoch nicht werfen ein Objekt von einem Typ zum anderen. Casting bedeutet, dass Sie das Objekt verwenden, als ob es von der anderen Art waren. In diesem Fall ist die Formen unterscheiden und es nicht getan werden kann.

Andere Tipps

Das Problem ist, dass Sie sowohl eine unbox und eine Besetzung zur gleichen Zeit zu tun versuchen. Dies wird fehlschlagen. Sie müssen zuerst unbox und dann in den entsprechenden Typ gegossen.

return (int)(double)value;

Eric Lippert schrieb kürzlich einen netten Artikel auf genau, warum dies notwendig ist. Es lohnt sich die Lese

Der double Wert innerhalb eines Objekts geboxt, und der einzige Weg, um es aus ist es als double unbox. Danach können Sie es zu einem int werfen können.

return (int)(double)value;

Sie können auch die Convert.ToInt32(object) Methode verwenden (wie tvanfosson vorgeschlagen), die das Objekt IConvertible geworfen wird und nennt es virtuelle ToInt32 Methode ist, was wiederum die Convert.ToInt32(double) Methode nennen. Das ist natürlich ein bisschen mehr Aufwand.

Sie konvertieren möchten, aber Sie tun, von doppelt auf int Gießen. Versuchen Sie folgendes:

    public object Convert(object value, ...)
    {
        return (int)(double)value;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top