locked
Custom CheckBox RRS feed

  • שאלה

  • היי,

    רציתי לשנות את סדר הבחירה ב CheckBox מ null->False->True ל null->True->False.

    לשם כך כתבתי מחלקת CustomCheckBox שיורשת מ CheckBox ועושה Override ל OnToggle:

      public class CustomThreeStateCheckBox : CheckBox
        {
            public CustomThreeStateCheckBox()
            {
                base.IsChecked = null;
            }
    
            protected override void OnToggle()
            {
                if (this.IsChecked == null)
                    this.IsChecked = true;
                else if (this.IsChecked == true)
                    this.IsChecked = false;
                else if (this.IsChecked == false)
                    this.IsChecked = null;
               
            }
        }

    ה CheckBox הזה אמור להיות בתוך עמודה ב DataGrid. הצלחתי להטמיע אותו. אבל פתאום הופיעה בעיה שלא היתה קיימת ב CheckBox הרגיל:

    אני בוחרת ב CheckBox, וכשעוברת לתא אחר הבחירה מתאפסת! לפעמים הוא מצליח לשמור על רצף של שתי בחירות ואז מאפס.

    יש למישהו קצה חוט?

    שתי נקודות נוספות: 

    - אני מטמיעה את הCheckBox באופן דינמי (משתמשת ב LoadXaml ע"מ לטעון string xaml)

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

    תודה רבה!

    יום רביעי 11 יולי 2012 19:07

תשובות

  • נמצאה הבעיה!

    מסתבר, שצריך להוריד את השורה 

    base.IsChecked = null;

    מהקונסטרקטור של המחלקה שיוצרת CustomCheckBox. כלומר הוא צריך להיות ריק, כך:

    public CustomThreeStateCheckBox()
            {
                
            }

     

    [אני מוכרחה לציין שזה מוזר, כי אותה מחלקה, עם שורת האתחול ל null עובדת מצוין ביצירה ע"י זאמל. הבעיה מופיעה רק ביצירה דינמית ב code behind.]

    תודה על הנסיונות לעזור :)

    • סומן כתשובה על-ידי RotemR10 יום רביעי 18 יולי 2012 08:13
    יום רביעי 18 יולי 2012 08:13

כל התגובות

  • במחלקה נוספת שאין בה כלום כלום חוץ מירושה מ CheckBox זה גם קורה??



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

    יום חמישי 12 יולי 2012 15:07
  • כן..

    זו המחלקה(הנוספת):

      public class TestChb : CheckBox
        {
            public TestChb()
            {
                base.IsChecked = null;
            }
    
      
        }

    יום חמישי 12 יולי 2012 17:03
  • לא נשמע לי הגיוני...

    איך אתה משתמש בו? (תראה את הקוד שבו אתה משתמש בו בדטה גריד)


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


    • נערך על-ידי Elad R Katz יום חמישי 12 יולי 2012 17:09
    יום חמישי 12 יולי 2012 17:08
  • זה קצת מסובך, כי אני יוצרת באופן דינמי ב Code Behind (אני מחויבת לעשות זאת כך כרגע):

    
    
    DataGridTemplateColumn templateColumnCHB = new DataGridTemplateColumn();
    
      string mCellTempCHB = @"
                                        <DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""  xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns:local=""clr-namespace:MyProj;assembly=MyProj"">
                                                    <local:CustomThreeStateCheckBox Style=""{DynamicResource ResourceKey=chbStyle}"" HorizontalAlignment=""Center"" Height=""Auto"" IsThreeState=""True"" IsChecked=""{Binding " + @"[" + someObj + @"]}"" Name=""checkBox1"" VerticalAlignment=""Top"" />
                                        </DataTemplate>";
    
                                    string mCellEditTempCHB = @"
                                        <DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""  xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns:local=""clr-namespace:MyProj;assembly=MyProj"">
                                                    <local:CustomThreeStateCheckBox Style=""{DynamicResource ResourceKey=chbStyle}"" HorizontalAlignment=""Center"" Height=""Auto"" IsThreeState=""True"" IsChecked=""{Binding " + @"[" + someObj + @"], Mode=TwoWay}""  Name=""checkBox1"" VerticalAlignment=""Top"" />
                                        </DataTemplate>";
    
     templateColumnCHB.CellTemplate = (DataTemplate)XamlReader.Load(new XmlTextReader(new StringReader(mCellTempCHB.ToString())));
     templateColumnCHB.CellEditingTemplate = (DataTemplate)XamlReader.Load(new XmlTextReader(new StringReader(mCellEditTempCHB.ToString())));
    
    חוץ מזה, ה DataGrid מקושר לשני אירועים:
    myDG.CurrentCellChanged += new EventHandler<EventArgs>(myDG_CurrentCellChanged);
    myDG.RowEditEnding += new EventHandler<DataGridRowEditEndingEventArgs>(DataGrid_RowEditEnding);    public void dgvDB_CurrentCellChanged(object sender, EventArgs e)    {          ((DataGrid)sender).BeginEdit();    } private void DataGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)        {            (sender as DataGrid).RowEditEnding -= DataGrid_RowEditEnding;            (sender as DataGrid).CommitEdit();              (sender as DataGrid).RowEditEnding += DataGrid_RowEditEnding;        }
    


    • נערך על-ידי RotemR10 יום חמישי 12 יולי 2012 17:37
    יום חמישי 12 יולי 2012 17:35
  • הי רותם,

    את מתחזקת כאן קוד שרחוק מלהיות איכותי. יש כאן איזשהו באג חמקמק שנוצר בצורה עקיפה ממה שאת כתבת, אבל הבעיה לפי דעתי יושבת בקוד שקיבלת כבר, שאת מתחזקת.
    באגים כאלו מטבעם יחסית קשים למציאה ללא "משחק" בקוד. יש לך אפשרות להעלות ריפרו (פרויקט מינימאלי שיוצר את הבאג, שאת יכולה להעלות) בשביל שאוכל לבדוק? יהיה קשה לפתור דבר כזה ללא ריפרו.

    אלעד.


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

    יום שני 16 יולי 2012 09:04
  • אוקיי, אבדוק אם אני יכולה להעלות ריפרו. תודה!
    יום שני 16 יולי 2012 18:56
  • נמצאה הבעיה!

    מסתבר, שצריך להוריד את השורה 

    base.IsChecked = null;

    מהקונסטרקטור של המחלקה שיוצרת CustomCheckBox. כלומר הוא צריך להיות ריק, כך:

    public CustomThreeStateCheckBox()
            {
                
            }

     

    [אני מוכרחה לציין שזה מוזר, כי אותה מחלקה, עם שורת האתחול ל null עובדת מצוין ביצירה ע"י זאמל. הבעיה מופיעה רק ביצירה דינמית ב code behind.]

    תודה על הנסיונות לעזור :)

    • סומן כתשובה על-ידי RotemR10 יום רביעי 18 יולי 2012 08:13
    יום רביעי 18 יולי 2012 08:13