2009-05-31 59 views
2

我一直在嘗試使用設計器中設置的一些自定義屬性來構建用戶控件。但是,控制涉及一些不應在運行時調整的互操作代碼和設置。有沒有辦法阻止設計器代碼最初設置後的值被更改?C#在運行時停止屬性更改

回答

6

你能修改屬性定義嗎?一種方法是,增加定點的屬性setter,並只允許一組操作(這通常是在InitializeComponent()來完成):

private int _myProperty; 
private bool _isMyPropertySet = false; 
public int MyProperty 
{ 
    set 
    { 
     if (!_isMyPropertySet) 
     { 
      _isMyPropertySet = true; 
      _myProperty = value; 
     } 
     else 
     { 
      throw new NotSupportedException(); 
     } 
    } 
} 
+0

其實,這比我的解決方案更清潔 - +1 – Kazar 2009-05-31 23:37:33

+0

這是我正在考慮使用的方法。我只是認爲我可能會錯過語言內置的東西,並希望使用最佳做法。 – PeteT 2009-05-31 23:46:25

+0

沒有任何其他的東西我可以想到,不知道更多關於你包裝的控制。即使知道,我可能不會有太大的幫助,但其他人可能會... – 2009-05-31 23:51:56

1

你可以在屬性setter中拋出異常嗎?

public int SomeProperty { 

    set { 

     if(designerComplete) { 
      throw new IllegalOperationException(); 
     } 

    } 

} 

將designerComplete設置爲類變量 - 在構造函數中調用InitializeComponent方法後將其設置爲true。

+0

如果您還添加了一張支票以查看您是否處於設計模式,這可能會起作用。 – 2009-05-31 23:33:20

+0

如果代碼在窗體設計器內運行,是否存在#define集?如果是這樣,那很可能是要走的路。 – Kazar 2009-05-31 23:36:03

+1

@Kevin:petebob796實際上並不意味着設計器代碼,他意味着InitializeComponent的運行時調用,它會將屬性設置爲表單設計器中設置的值。所以檢查設計模式不會做他想做的事情。 – 2009-05-31 23:38:34

1

的WinForms的架構提供了一個內置的方式來測試是否代碼目前正在設計模式下執行 - Component.DesignMode屬性。

所以你可能要實現這樣的事情:

private int _foo; 

public int Foo 
{ 
    get { return _foo; } 
    set 
    { 
     if (this.DesignMode) 
      throw new InvalidOperationException(); 

     _foo = value; 
    } 
} 
+1

這是正確的答案,但DesignMode屬性可直接在用戶控件上使用,不需要爲它訪問網站。 – benPearce 2009-06-01 00:07:35

+0

DesignMode不會執行您認爲的操作。如果窗體是從Visual Studio設計器中加載的,它將返回true。如果表單在運行時從「設計器創建的」InitializeComponent()中加載,它將返回false。 OP感興趣的是後者。 – 2009-06-01 00:17:27

+0

@Michael:你確定是這種情況嗎?我之前使用過這種方法來達到同樣的目的,它的工作非常好。 – Noldorin 2009-06-01 00:30:13

2

邁克爾提供了極大的答案,這會在運行時解決您的問題。但是,在設計時,如果需要不止一次更改該值(設計時間和概率可能很高),那麼您需要將DesignMode檢查與Michaels示例結合使用:

private int _myProperty; 
private bool _isMyPropertySet = false; 
public int MyProperty 
{ 
    set 
    { 
     if (this.DesignMode || !_isMyPropertySet) 
     { 
       _isMyPropertySet = true; 
       _myProperty = value; 
     } 
     else 
     { 
       throw new NotSupportedException(); 
     } 
    } 
} 

現在,您將可以在設計過程中將此值編輯到您的內容中,而不會遇到NotSupportedException()並在第二組中獲得一個拙劣的設計器。

+0

是的,在所有關於DesignMode的討論之後,這是該設置者的一個重要補充。 – 2009-06-01 05:24:57