【发布时间】:2017-02-26 19:40:32
【问题描述】:
我创建了一个具有 PropertyChangedCallback 函数的 AttachedProperty,该函数对 TextBlock 进行一些格式化。但是要执行格式化,需要 Tag 属性。标签本身绑定到 Multiconverter 的输出。
但我的问题是,FNamePropertChangedCallback 是在标签绑定到 Multibinding 的输出之前执行的。因此,当触发 FNamePropertyChangedCallback 时,Tag 仍然为 Null。
有什么方法可以影响属性绑定的顺序吗? 我需要在绑定 FInlineProperty 之前绑定 Tag。
public static readonly DependencyProperty FInlinePropertyProperty =
DependencyProperty.RegisterAttached("FInlineProperty", typeof(string), typeof(MainWindow),
new PropertyMetadata(null, FNamePropertyChangedCallback));
<TextBlock local:MainWindow.FInlineProperty="{Binding Name}" TextWrapping="WrapWithOverflow">
<TextBlock.Tag>
<MultiBinding Converter="{StaticResource TupleConverter}">
<Binding />
<Binding ElementName="Window"/>
</MultiBinding>
</TextBlock.Tag>
</TextBlock>
顺便说一句:有人知道如何将local:MainWindow.FInlineProperty="{Binding Name}" 写成长格式吗?我试过<TextBlock.local:MainWindow.FInlinse>...</TextBlock.local:MainWindow.FInlinse>,但编译器抱怨它。
2017 年 2 月 25 日更新:
我按照你的建议做了,并将所有内容绑定到我的附加属性。
<TextBlock TextWrapping="WrapWithOverflow" >
<local:MainWindow.FInlineProperty>
<MultiBinding Converter="{StaticResource GroupConverter}">
<Binding />
<Binding ElementName="Window" Path="MySetup" />
</MultiBinding>
</local:MainWindow.FInlineProperty>
</TextBlock>
问题在于,它在第一次创建 ListBoxItem 时工作。但从 MySetup 更新属性不会重新触发 FNamePropertyChangedCallback。
MySetup.ColorString = "green"; // this does not retrigger the callback
MySetup = MySetup.Copy(); // this does retrigger the callback
所以目前只为 MySetup 分配一个自身的新副本(更改引用)会再次触发回调函数。
这就是为什么我明确绑定 name 属性的原因。
如果我显式绑定到 MySetup.ColorString 会触发,但我需要绑定到 MySetup 才能拥有所有数据,所以问题是,当绑定对象本身(参考)时,如何强制绑定再次执行没变,但里面的东西变了?
【问题讨论】:
-
通常,您将拥有多个属性,只是在设置所有属性之前不应用任何效果。你为什么使用标签而不是多个附加属性?
标签: c# wpf data-binding