在PropertyChangedCallback之后访问自定义依赖项属性的所有属性

时间:2013-03-12 17:55:49

标签: wpf binding dependency-properties

我有一个示例依赖属性定义如下:

public Polyline Shape
{
    get { return (Polyline)GetValue(ShapeProperty); }
    set { SetValue(ShapeProperty, value); }
}

public static readonly DependencyProperty ShapeProperty =
DependencyProperty.Register("Shape", typeof(Polyline), 
typeof(CustomControl), new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.AffectsRender, onShapeAdded));

我这样设置:

<local:CustomControl>
    <local:CustomControl.Shape>
        <Polyline Points="0,180 0,80 70,80 90,180 0,180" />
    </local:CustomControl.Shape>
</local:CustomControl>

回调看起来像这样:

private static void onShapeAdded(DependencyObject d,
    DependencyPropertyChangedEventArgs e)
{
    Polyline control = (Polyline)e.NewValue;
    //control.Points is always null
}

为什么在回调期间Points集合始终为null? (它发生在每个属性)最后点设置,所以我想我很快就会访问我的控件,但是何时以及如何使用它的所有属性设置来访问控件?

1 个答案:

答案 0 :(得分:0)

onShapeAdded方法实际上是PropertyChangedCallback的事件处理程序,这意味着它会在Shape属性更改时触发。在Polyline添加Points并初始化Polyline属性之前,显然会触发此更改。

您可以尝试通过将<Window.Resources> <Polyline x:Key="myPolyline" Points="0,180 0,80 70,80 90,180 0,180" /> </Window.Resources> <local:CustomControl Shape="{DynamicResource myPolyline}"/> 定义为资源来解决此问题,这意味着它将在添加到控件之前进行初始化。例如:

Polyline

我相信如果以这种方式添加,{{1}}将完全初始化。