2012-01-15 52 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。