当声明的XAML列表项设置了它们的依赖属性时

本文关键字:依赖 属性 设置 声明 XAML 列表 | 更新日期: 2023-09-27 18:07:25

背景

我正在创建一个自定义wpf面板。为了帮助布局子项,它使用了一个辅助列表(类似于Grid)。RowDefinitions或Grid.ColumnDefinitions),我称之为"布局"。每个布局都有几个依赖属性,子条目使用附加属性来确定它们的位置,如下所示。
<Panel>
    <Panel.Layouts>
        <Layout/>
        <Layout Attachment="Right"/>
        <Layout Attachment="Left" Target="0"/>
    </Panel.Layouts>
    <ChildItem Panel.Layout="0"/>
    <ChildItem Panel.Layout="1"/>
    <ChildItem Panel.Layout="2"/>
<Panel/>

显然,事情被简化了一点,但长话短说:我需要在"安排"过程发生之前处理添加的布局。我已经创建了一个自定义集合,我可以看到添加的项目(见下面的代码),但是项目只有它们的默认属性。

LayoutCollection: IList
{
    public int IList.Add(object value)
    {
        // When first starting, this line always returns the default value, not the one set in XAML
        Attachment a = (value as Layout).Attachment;
        // Other code happens below...
    }
 }

但是,当我在面板初始化后查看集合时,属性都设置正确。这就引出了我的问题:

在XAML和面板初始化之间的过程中,项目被分配属性的时间点是什么,它们是如何分配的?我需要以某种方式连接到它并运行一些代码

当声明的XAML列表项设置了它们的依赖属性时

我的想法是,WPF的面板布局系统并不是真正设计为拦截你想要的方式。

但是有一个机制可以"同步"你的自定义DependencyProperties。问题是什么时候你需要这些属性在布局过程中?

如果是在"ArrangeOverride"期间,则需要设置"AffectsArrange"。或AffectsMeasure在MeasureOverride期间。这个还有其他几种口味,但我想这两种都能满足您的要求。

例如,如果你选择了影响范围,你的面板被通知列表。Add, ArrangeOverride将被调用,并且新添加的项可以在您的排列逻辑中使用。