Powiedzmy, że chcę mieć nową kontrolkę. Dziedziczę z np. klasy Panel i piszę
[Kod C#] [Browsable(true)] /// <summary> /// Text to display /// </summary> public new string Text { get { return _text; } set { if (_text != value) { _text = value; Invalidate(); } } } |
wrzucam z Toolbara tą nową kontrolkę z właściwością Text. Można teraz edytować pole Text we właściwościach kontrolki w czasie projektowania.
Ale właściwość Text nie jest serializowana do InitializeComponents.
Jak się okazało, ludzie radzą, aby dodać jeszcze jeden atrybut:
[Kod C#] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] /// <summary> /// Text to display /// </summary> public new string Text { get { return _text; } set { if (_text != value) { _text = value; Invalidate(); } } } |
Atrybut DesignerSerializationVisibility określa jak ma być serializowana właściwość. Wydawałoby się, że teraz właściwość powinna działać dobrze.
Ale niestety tak nie jest. Zachowanie jest nadal to samo: można ustawić właściwość, ale nie jest ona zapisywana do InitializeComponents czyli za pierwszym
razem kiedy Visual Studio będzie serializowało właściwości klasy, właściwość Text zostanie porzucona.
Kilka wątków na ten temat na różnych forach albo kończy się rozwiązaniem powyższym, które wygląda na to, że czasem wystarczy (możliwe, że
został dodany inny atrybut, który powoduje poprawne zachowanie tej właściwości). Moje próby znalezenia takiej właściwości zakończyły się
niestety niepowodzeniem.
Porzuciłem już nadzieję na to, żeby zachować normalne nazewnictwo tej właściwości, dodałem jeszcze tylko z ciekawości jeden atrybut:
[Kod C#] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] [DefaultValue(“”)] /// <summary> /// Text to display /// </summary> public new string Text { get { return _text; } set { if (_text != value) { _text = value; Invalidate(); } } } |
No i okazało się, że dodanie atrybutu DefaultValue powoduje, że serializacja działa już normalnie.
Może ktoś jest w stanie wyjaśnić, dlaczego po dodaniu DefaultValue serializacja w tym bardzo szczególnym wypadku działa dobrze?
