سؤال

لقد قمت بإنشاء محول للتحويل من مزدوج إلى عدد صحيح.

لكن السطر "القيمة (int) قيمة ؛" يحصل دائمًا على "فريق محدد غير صالح".

ما الذي يجب علي فعله حتى يتمكن المحول الخاص بي من تحويل الرقم المزدوج بنجاح ويرسل عددًا صحيحًا؟

محول:

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>
هل كانت مفيدة؟

المحلول

أنت تحاول التحويل (وليس التحويل) من double إلى int، وهو ما لن ينجح.تحتاج إلى إجراء تحويل ضمني أو استخدام Convert.ToInt32() - نظرًا لأن الوسيطة هي في الواقع كائن نوع أعتقد أنك ستحتاج إلى الأخير لإبقاء المترجم سعيدًا.الأمر متروك لك فيما إذا كنت تريد تضمين موفر تنسيق الثقافة أم لا.

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

يمكنك استخدام عامل الإرسال عندما يكون الكائن متماثلًا شكل, ، أي عندما يكون أحد الكائنات مثيلًا للنوع الذي تقوم بالإرسال إليه.على سبيل المثال، إذا كانت الفئة Foo تمتد إلى الفئة Bar، فيمكنك إرسال كائن من النوع Foo لكتابة Bar - لأن كائن Foo يحتوي على جميع الأساليب والخصائص التي يمتلكها كائن Bar.ومع ذلك، لا يمكنك تحويل كائن من النوع Bar لكتابة Foo لأن Foo يغير (أو يمكنه التغيير، بقدر ما يتعلق الأمر بالمترجم) شكل من Bar، عن طريق إضافة أساليب أو خصائص لا يمتلكها كائن Bar.

في حالتك، فأنت تتعامل مع أنواع بدائية تشترك فقط في واجهة الكائن - ولا توجد علاقة وراثة بينهما باستثناء أن كلاهما مشتق من الكائن.ومع ذلك، هناك ضمنا تحويل بين الاثنين.يمكنك تعيين نوع كائن لمتغير من النوع الآخر، على الرغم من أنك قد تفقد بعض الدقة في القيمة.

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

ومع ذلك، لا يمكنك إرسال كائن من نوع إلى آخر.يعني الصب أنك ستستخدم الكائن كما لو كان من النوع الآخر.في هذه الحالة الأشكال تختلف ولا يمكن القيام بذلك.

نصائح أخرى

المشكلة هي أنك تحاول القيام بكل من عملية إلغاء العلبة والإرسال في نفس الوقت.هذا سوف يفشل.يجب عليك أولاً فتح الصندوق ثم الإرسال إلى النوع المناسب.

return (int)(double)value;

كتب إريك ليبرت مؤخرًا مقالة لطيفة حول سبب ضرورة ذلك بالضبط.انه يستحق القراءة

ال double يتم وضع القيمة في صندوق داخل كائن، والطريقة الوحيدة لإخراجها هي إخراجها من الصندوق كملف double.بعد ذلك يمكنك إرسالها إلى int.

return (int)(double)value;

يمكنك أيضًا استخدام Convert.ToInt32(object) الطريقة (كما اقترح tvanfosson)، والتي ستحول الكائن إلى IConvertible وتطلق عليه اسم Virtual ToInt32 الطريقة، والتي بدورها سوف تستدعي Convert.ToInt32(double) طريقة.وهذا بالطبع أكثر قليلاً من النفقات العامة.

تريد التحويل ولكنك تقوم بالتحويل من double إلى int.جرب هذا:

    public object Convert(object value, ...)
    {
        return (int)(double)value;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top