2011-04-13 201 views
2

我與自定義屬性的用戶控制,如下所示:用戶控制的定製屬性丟失狀態時用戶控制重建

[DefaultValue(true)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
[Description("Gets or sets whether the \"Remove\" button is visible.")] 
public bool ShowRemoveButton 
{ 
    get 
    { 
     return this.removeButton.Visible; 
    } 
    set 
    { 
     this.removeButton.Visible = value; 
    } 
} 

控制包含一個標準按鈕控制。該屬性用於顯示或隱藏按鈕。用戶控件內置在一個單獨的項目組件中。我把它放在一個表單上,我可以設置和取消設置上述屬性,並且一切看起來都可以正常工作。但是,當包含用戶控件的項目被重建時,屬性值會翻轉爲「false」,這不是默認值。

如何防止自定義屬性丟失/改變控件重建時的狀態?

回答

3

問題是,DefaultValueAttribute只告訴設計師屬性的默認值是什麼。它控制是否以加粗顯示顯示屬性,以及右鍵單擊屬性並從上下文菜單中選擇「重置」時重置的值。

它是什麼不是 do是在運行時將屬性設置爲特定值。爲此,您需要在您的用戶控件的構造方法中放置代碼。例如:

// set default visibility 
this.removeButton.Visible = true; 

否則,如您所述,重建項目時,屬性的值將被重置。它將在設計器的「屬性」窗口中顯示爲加粗,因爲它與默認值(如DefaultValueAttribute中指定的)不匹配,但該屬性不會更改設置的值。

+0

我嘗試了上面,並設置「this.removeButton.Visible =真」在用戶控件的構造函數。最初它似乎保持其狀態。沒有改變的重建不會改變屬性值。但是,當我對用戶控件進行了更改並重新構建時,該屬性又切換爲「false」並變得粗體。這很煩人。 – Elan 2011-04-13 15:01:30

+0

@Elan:然後你的代碼中必須有一些東西在改變它的值。我創建了一些可重用的控件庫和用戶控件,但我從來沒有遇到過這個問題。在代碼中進行搜索以查看是否有任何設置'removeButton.Visible'屬性。它可能隱藏在'* .Designer.cs'文件中,它被自動插入並且看不到它。 – 2011-04-14 05:00:45

+0

用戶控件在構造函數中將屬性設置爲「true」。主窗體的designer.cs是將「ShowRemoveButton」屬性生成爲false的代碼。這是唯一的兩個地方。我在用戶控件的屬性聲明中刪除了[DefaultValue(true)]屬性,希望將主窗體上的屬性設置爲「true」會導致值停滯。然而,當designer.cs類被重新生成並被替換爲「false」時,屬性值「true」會丟失。我無法獲得「真實」的價值。這發生在一些表單設計者更改和重建之後。 – Elan 2011-04-14 16:12:06

2

一個簡單的方法來保持任何包含從被在相關屬性的(反)序列復位控件的屬性是使用私人支持字段的屬性和分配的DefaultValue屬性的參數相匹配的默認值。在這種情況下,這是下面的_showRemoveButton = true聲明/分配。

[DefaultValue(true)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
[Description("Gets or sets whether the \"Remove\" button is visible.")] 
public bool ShowRemoveButton 
{ 
    get 
    { 
     return _showRemoveButton; 
    } 
    set 
    { 
     _showRemoveButton = value; 
     this.removeButton.Visible = value; 
    } 
} 
private bool _showRemoveButton = true;