2012-01-15 47 views
-1

我在看從Charles Petzold一些代碼,他使用了PropertyChangedCallback在以前的.NET提供此功能

public static readonly DependencyProperty CenterProperty = 
    EllipseGeometry.CenterProperty.AddOwner(
    typeof(CenteredEllipse), 
    new FrameworkPropertyMetadata(new Point(0, 0), 
     EllipsePropertyChanged)); 

以下語法,如果你做這種方式,你需要把它不起作用財產改變回調在新的new PropertyChangedCallback(EllipsePropertyChanged)。他還直接編輯變量:

void EllipsePropertyChanged(DependencyPropertyChangedEventArgs args) 
{ 
    elipGeo.Center = Center; 
    elipGeo.RadiusX = RadiusX; 
    elipGeo.RadiusY = RadiusY; 
    InvalidateMeasure(); 
} 

它應該是這樣的:

static void EllipsePropertyChnaged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
    { 
     EllipseGoemetry ellipseGeo = (EllipseGoemetry)obj; 
     args.newValue ... 
    } 

是否有人知道這是怎麼回事?

回答

1

第一個是Delegate Type Inference的一個例子。從此:http://blogs.msdn.com/b/noahc/archive/2008/09/23/delegate-type-inference-in-c.aspx

什麼我不知道,直到今天這條線#13會工作,你可以 只通過方法名作爲參數,並委託類型 會被推斷。好,易於。 #14 /#15號線對我來說也是新的, 以及至少有關使用()作爲空白參數列表的部分。

+0

我試過了,它沒有工作,它不承認名稱和任何類的檔案。我不得不將obj投入到類中,然後修改變量。 – mihajlv 2012-01-15 19:16:00

1

elipGeo被定義爲該類的字段,該代碼是正確的。

您不需要明確地創建代表方法,這是隱式完成的,this feature被添加到C#2.0中。

+0

我試過了,它沒有起作用,它不能識別班級的名字和任何字段。我不得不將obj投入到類中,然後修改變量。 – mihajlv 2012-01-15 19:15:39

+0

@mihajlv:我不打算測試這些代碼,你甚至會複製一切1:1嗎? – 2012-01-15 19:18:32

+0

我會再試一次。謝謝。 – mihajlv 2012-01-15 19:21:19

1

的事情是,他使用相同的名稱有兩個方法,因此可能會比較混亂:

static void EllipsePropertyChanged(DependencyObject obj, 
    DependencyPropertyChangedEventArgs args) 
{ 
    (obj as CenteredEllipse).EllipsePropertyChanged(args); 
} 

void EllipsePropertyChanged(DependencyPropertyChangedEventArgs args) 
{ 
    elipGeo.Center = Center; 
    elipGeo.RadiusX = RadiusX; 
    elipGeo.RadiusY = RadiusY; 
    InvalidateMeasure(); 
} 

第一個是代表,第二個是隻是一個方法他在代表中打電話給他的班級,在那裏他按照它應該做的那樣投了obj。