2016-06-10 54 views
0

具有稱爲PanelGroup的類,並且它具有名爲ElementControl的屬性,其類型爲Control。因爲我知道控制不是可序列化的,那麼有什麼建議這個類被序列化的做法?謝謝。具有基於控件的屬性的c#類序列化

public class PanelGroup 
{ 
    public PanelGroup(FormElementGroupBase parentElement) : base(parentElement) 
    { 
     Intialize(); 
    } 

    public PanelGroup(FormElementGroupBase parentElement, int id, string name, bool isVertical) : base(parentElement, id, name) 
    { 
     Intialize(); 
     IsVertical = isVertical; 
    } 

    private void Intialize() 
    { 
     this.ItemType = DomainItemTypes.PANEL_GROUP; 
     this.ElementControl = new PanelControl(); 
     this.ElementControl.MinimumSize = new Size(50, 50); 
     (this.ElementControl as PanelControl).AutoSize = true; 
     (this.ElementControl as PanelControl).AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 

     if (ParentElement != null) 
     { 
      ParentElement.ElementControl.Controls.Add(this.ElementControl); 
     }; 

     this.ElementControl.AllowDrop = true; 
     this.ElementControl.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Control_OnMouseUp); 
     this.ElementControl.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Control_OnMouseDown); 
     this.ElementControl.KeyDown += new KeyEventHandler(this.Control_OnKeyDown); 
     this.ElementControl.DragDrop += new DragEventHandler(OnDragDrop); 
     this.ElementControl.DragOver += new DragEventHandler(OnDragOver); 
    } 

    [Browsable(false)] 
    public override string NamePrefix 
    { 
     get { return "PanelGroup"; } 

    } 

    internal sealed override void Highlight() 
    { 
     (this.ElementControl as PanelControl).Appearance.BorderColor = SelectionColor; 
    } 
} 
+0

您的預期結果是什麼?如果序列化和反序列化一個PanelGroup對象,你是否期望ElementControl爲null?或者您是否期望將所有相關屬性設置爲匹配預序列化值? –

回答

0

您有幾個選項。最簡單的方法是在你的ElementControl屬性上放置一個[NonSerialized]屬性,這意味着當你序列化你的PanelGroup時它會被跳過。這會導致您在反序列化和重新設置屬性時丟失ElementControl的值。

另一種選擇是手動序列化對象(請參閱here),但這可能需要大量工作。

像往常一樣,當遇到這種問題時,最好的選擇是重構它。非控制類真的沒有理由在其中有一個控制類的實例。您的域代碼(意思是您創建的用於表示真實概念的自定義類)應與您的用戶界面分開。您可能需要具有代表稍後重新創建控件所需的所有數據的屬性,但您可以在不依賴於任何特定於UI的實現詳細信息(如Control類)的情況下執行此操作。

+0

如果我按照你的說法重構它,那麼我必須維護另一個對象模型,以便管理UI事件,如「OnDragDrop」,「OnDragOver」等,並且此控件集合和對象(PanelGroup等)集合之間必須存在關係。 – Tim

+0

這是正確的 - 你將有一個單獨的模型負責UI邏輯,而這個類代表域或業務邏輯。他們之間可能有一些關係,但這種分離整體上仍然更好。查看MVP,MVC,MVVM模式,瞭解相同根概念的一些示例。 –

相關問題