DependencyProperty更改不会触发排列

时间:2013-07-24 13:52:49

标签: c# wpf wpf-controls

我有一个自定义面板,它定义了这个依赖属性:

public static readonly DependencyProperty DragPositionProperty =
    DependencyProperty.Register(
    "DragPosition",
    typeof(Point),
    typeof(LogViewHeaderPanel),
    new FrameworkPropertyMetadata(
        new Point(),
        FrameworkPropertyMetadataOptions.AffectsParentArrange
    )
);

注意:我也尝试过使用FrameworkPropertyMetadataOptions.AffectsArrange ...

LogViewHeaderPanel是我的自定义ItemsControl的面板,名为LogViewHeader。它的项目类型为ColumnHeader。无论何时移动鼠标,并在LogViewHeader中满足一些其他条件,目标ColumnHeader都使用以下代码设置属性:

_currentlyActiveColumnHeader.SetValue(
    LogViewHeaderPanel.DragPositionProperty,
    new Point(suggestedXPosition, originalPosition.Y)
);

如果我在我的重写LogViewHeaderPanel.ArrangeOverride上设置断点,我可以看到它在创建/调整大小时调用LogViewHeader,但是当它的子节点上设置了DragPosition属性时却没有。

为什么在设置属性时FrameworkPropertyMetadataOptions.AffectsParentArrange参数不会触发排列?

1 个答案:

答案 0 :(得分:1)

您要在DragPosition上设置_currentlyActiveColumnHeader属性,该属性不是LogViewHeaderPanel。对于此类用途,您必须将DragPosition注册为attached property

只需将DependencyProperty.Register替换为DependencyProperty.RegisterAttached

public static readonly DependencyProperty DragPositionProperty =
    DependencyProperty.RegisterAttached(
        "DragPosition", typeof(Point), typeof(LogViewHeaderPanel),
        new FrameworkPropertyMetadata(
            new Point(), FrameworkPropertyMetadataOptions.AffectsParentArrange));