2013-07-16 58 views
2

無論何時結構或對象屬性發生變化,我都需要進行控制。它沒有任何我可以使用的事件。是否有可能知道對象屬性何時更改?

示例:如何知道寬度或高度何時更改?這甚至有可能嗎?

「System.Drawing.Size =大小」

private Size mySize; 

    public Size MySize 
    { 
     get { 
      //What if X or Y is changed?? I need to know that 
      return mySize; 
     } 
     set { 

      mySize = value; 
     } 
    } 

對於這個特定的情況下,如果尺寸性能只讀的問題將得到解決。但他們不是。

+3

你可以在那裏創建自己的活動。 .NET有一個可以用作基礎的「OnPropertyChanged」事件。 –

+1

是你的類或框架的大小? – cadrell0

+0

您可能需要使用[PropertyChangedEventHandler](http://msdn.microsoft.com/en-us/library/system.componentmodel.propertychangedeventhandler.aspx) –

回答

4

編輯在看看回應意見:

示例:如何知道寬度或高度何時更改?這甚至有可能嗎?

不,這是不可能的。但是,這並不重要。

當您從班級中返回Size,因爲Size is a struct,您將返回一個副本。即使用戶更改了您返回的Size中的WidthHeight,也不會影響您班級中的mySize結構。

爲了改變你的尺寸,他們需要改變整個事情,即:

var temp = yourClass.MySize; 
temp.Width = newWidth; 
yourClass.MySize = temp; // The user will need to assign an entire Size 

至於你應該關注的Size屬性是有效只讀的,因爲System.Drawing.Size是值類型。


原來的答覆,如果假定寬度和高度分別爲用戶類的屬性:

主要有兩種選擇 - 而不是存儲

你可以計算在飛行的大小,它的基礎上,你的寬度和高度:

public Size MySize 
{ 
    get {    
     return new Size(Width,Height); 
    } 
    set { 
     Width = value.Width; 
     Height = value.Height; // Set Width/Height appropriately 
    } 
} 

另一種選擇是重新計算你的尺寸在你的屬性設置寬度和高度:

public double Width 
{ 
    get { return width; } 
    set 
    { 
     width = value; 
     mySize = new Size(width, Height); // Compute new size, so it's always correct 
    } 
} 

最後,如果你使用像INotifyPropertyChanged東西來追蹤變化,你也可以訂閱自己PropertyChanged事件,如果它是適當的屬性,重新計算你的尺寸。

+0

如果有人更改寬度或高度,我的班級將不會意識到這一點。這就是問題。 – Pedro77

+0

@ Pedro77同樣也是班級的寬度和高度部分?如果是這樣,就讓他們的屬性,他們改變它的唯一方法就是你知道它... –

+0

不,他們是.NET大小結構的一部分。 – Pedro77

1

編輯意識到這一點之後是一個結構:

考慮埃裏克利珀在他關於易變的Structs博客精彩文章 Mutating Readonly Structs(Evil)

INotifyPropertyChanged Interface

INotifyPropertyChanging Interface

+0

是的,我知道。但是Size是一個結構體,它沒有實現這個接口。所以如果有人改變寬度或高度,我的班級將不會意識到這一點。 – Pedro77

+0

框架本身不提供這樣的選項,你必須實現一個。 –

3

簡短的回答 - 不,在字段更改時觸發的普通舊C#對象上沒有事件。

你的選擇我所知道的:

  • 改變你的類(如果你能)火從你的類事件
  • 繼承和編寫事件在派生類中燒製代碼(假設虛擬的get/set是可能的)
  • 將屬性提取到接口中,在整個代碼中使用該接口併爲觸發屬性更改的通用接口構建包裝器。

注意mutable struct considered evil - 儘量完全避免「每當struct屬性更改」的情況。

+0

解決方法是創建一個新的Size類,如實現屬性更改事件的「class MySize」。它不可能使用舊的Size結構,因爲寬度或高度可以在我的課程外面更改。我正在跳躍,有一個解決這個問題的方法。 – Pedro77

相關問題