【发布时间】:2011-03-22 19:46:24
【问题描述】:
我有一个TabControl,我想做以下事情:
- 取
TabItems 中TabControl.Items中的第一个和最后一个 - 获取他们的
Margins - 将那些
Thicknesses 提供给转换器以将这两个结构转换为最终值
这是显示我正在尝试做的相关代码:
<Border.Padding>
<MultiBinding Converter="{StaticResource MarginsToPaddingConverter}">
<Binding Path="Margin">
<Binding.Source>
<Binding RelativeSource="{RelativeSource AncestorType=TabControl}" Path="Items" Converter="{StaticResource ItemCollectionToFirstItemConverter}" ConverterParameter="{x:Type TabItem}" />
</Binding.Source>
</Binding>
<Binding Path="Margin">
<Binding.Source>
<Binding RelativeSource="{RelativeSource AncestorType=TabControl}" Path="Items" Converter="{StaticResource ItemCollectionToLastItemConverter}" ConverterParameter="{x:Type TabItem}" />
</Binding.Source>
</Binding>
</MultiBinding>
</Border.Padding>
但我不能将Binding 设置为RelativeSource 或Source 或其他Binding。基本上手头的解决方案是创建转换器,它将采用TabControl.Items并将其转换为最终值,但问题是我想为TabItems 的Margins 设置动画,所以我需要专门绑定到这些属性。如果我绑定到TabControl.Items,如果Margin 的任何TabItem 发生变化,Border.Padding 将不会被刷新。那我该怎么办?
更新
好的,因此一种可能的解决方案是挂钩TabItem.Loaded 事件,然后使用DependencyPropertyDescriptor 在适当的属性上挂钩Changed 事件,然后挂钩TabItem.Items 集合中的所有项目,挂钩任何新项目并自动取消所有旧物品的挂钩,并像数百万其他东西一样挂钩。但这很复杂,就像 400 LOC。没有更简单的吗?最好是纯XAML。
【问题讨论】: