locked
IValueConverter - השאלה מתייחסת ל C# RRS feed

  • שאלה

  • שלום , 

    הגדרתי COnverter שמקבל ערך מספרי מה TextBox וממיר אותו לצבע.

    עבדתי עם הדיבאגר , ולפי מה שראיתי ה Coverter טוב , אבל יש שורה של המרה שהיא עושה לי צרות, יש בטח משהו קטן שאני לא שם  לב אליו .

    קצת עזרה, נמות טובות ..

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using System.Windows.Data;
    namespace WpfApplication2
    {
      public  class I_numToColor:IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                int myNum = -2;
             
                ///למה פה הוא לא מצליח להמיר ? 
                myNum = int.Parse((string)value); 
               
                ///
    
                if (myNum>0)
                {
                    return "Red"; 
                }
                else
                {
                    return "Blue";
                }
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    }
    
    ========
    
    <Window x:Class="WpfApplication2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           xmlns:Ami="clr-namespace:WpfApplication2"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <Ami:I_boolToVisab x:Key="myConverter"/>
            <Ami:I_numToColor x:Key="myColorConverter"/>
        </Window.Resources>
        <Grid>
            <CheckBox Content="{Binding Path=Text, ElementName=textBox1,  Mode=TwoWay, UpdateSourceTrigger=Explicit}" Height="27" HorizontalAlignment="Left" Margin="146,60,0,0" Name="checkBox1" VerticalAlignment="Top" Width="171" IsChecked="True" />
            <Button Content="Button" Height="46" HorizontalAlignment="Left" Margin="144,107,0,0" Name="button1" VerticalAlignment="Top" Width="155" Click="button1_Click" Visibility="{Binding ElementName=checkBox1, Path=IsChecked, Converter={StaticResource myConverter}}" Background="{Binding ElementName=textBox1, Path=Text, Converter={StaticResource myColorConverter}}" />
            <TextBox Height="41" HorizontalAlignment="Left" Margin="144,175,0,0" Name="textBox1" VerticalAlignment="Top" Width="152" Background="{Binding}" />
            <Button Click="button2_Click" Content="Explict" Height="38" HorizontalAlignment="Left" Margin="59,175,0,0" Name="button2" VerticalAlignment="Top" Width="48" />
        </Grid>
    </Window>
    
    

     
    יום שני 14 מאי 2012 12:20

תשובות

  • כעת התוכנית עובדת לי  , לאחר שהשתמשתי ב Try_Cath

    להלן הקוד : 

            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                string def = "pink";
                try
                {
                    int myVal = System.Convert.ToInt32(value);
                    if (myVal>0)
                    {
                        return "red";
                    }
                    else
                    {
                        return "green";
                    }
                }
                catch (Exception)
                {
    
                    return def;
                }
            }
    

    • סומן כתשובה על-ידי עמיאל כהן יום שלישי 15 מאי 2012 07:13
    יום שלישי 15 מאי 2012 07:13

כל התגובות

  • לפני שאתה ניגש למשתנה value יש לבצע בדיקת תקינות שהוא אינו null או לא מאותחל

    (if(value != null && value != DependencyProperty.UnsetValue  

    (לפעמים מספיק תנאי אחד)

    בהצלחה

    יום שני 14 מאי 2012 13:17
  • ניסיתי מה שכתבת לי - זה לא עובד . 

    אני מצרף תמונה של השגיאה ( זמן ריצה ) . 

    יום שני 14 מאי 2012 13:46
  • את התנאי הנ"ל יש לרשום לפני ההמרה

    ואם אכן הערך הוא null - נחזיר צבע ברירת מחדל כלשהוא

    יום שני 14 מאי 2012 13:58
  • עדיין לא עובד.  

       public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                
             
                ///למה פה הוא לא מצליח להמיר ? 
                 
               
                ///
                if (value != null )
                {
                    int myNum; 
                    myNum = int.Parse((string)value);
                    if (myNum > 0)
                    {
                        return "Red";
                    }
                    else
                    {
                        return "Blue";
                    }
                }
                else
                {
                    return "black";
                }
            }

    יום שני 14 מאי 2012 14:04
  • מה השגיאה?
    יום שני 14 מאי 2012 14:07
  • בדיוק כמו שבתמונה שפרסמתי בתחילת השרשור
    יום שני 14 מאי 2012 14:39
  • השגיאה יכולה להיות או מפני שהוכנסו לתיבת הטקסט ערכים לא מספריים או שהערך הוא null או UnsetValue

    מה הערך של value כשהקוד נופל? אולי תנסה להשתמש בTryParse?

    יום שני 14 מאי 2012 16:03
  • כעת התוכנית עובדת לי  , לאחר שהשתמשתי ב Try_Cath

    להלן הקוד : 

            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                string def = "pink";
                try
                {
                    int myVal = System.Convert.ToInt32(value);
                    if (myVal>0)
                    {
                        return "red";
                    }
                    else
                    {
                        return "green";
                    }
                }
                catch (Exception)
                {
    
                    return def;
                }
            }
    

    • סומן כתשובה על-ידי עמיאל כהן יום שלישי 15 מאי 2012 07:13
    יום שלישי 15 מאי 2012 07:13
  • אתה מודע לזה שעטיפת הקוד ב-try ו-בcatch סה"כ דחפה את הבעיה מתחת לשטיח?

    לדעתי ההמרה נכשלה מכיוון שייתכן שהמחרוזת שקיבלת ריקה, ולכן לא בפורמט מתאים להמרה.

    התנאי הבאה אמור להוות פתרון ראוי יותר:

    if (value != null && value.ToString() != "")

    ובאופן כללי, כדאי שתקרא קצת על ה-try ו-catch כי נראה שפיספסת קצת את הרעיון.

    בעיניי, עטיפת קוד ב-try ו-catch שלא לצורך וכאשר יש פתרונות אחרים שבאמת נוגעים בלב הבעיה, היא הרגל מגונה.

    בהצלחה :)


    • נערך על-ידי Melgino יום חמישי 17 מאי 2012 00:30
    יום חמישי 17 מאי 2012 00:26
  • אכן. הכלל אומרים שלא זורקים exception כשאפשר לצפות את הבעיה מראש.

    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt

    יום חמישי 17 מאי 2012 13:55