我创建了一个具有PropertyChangedCallback函数的AttachedProperty,它对TextBlock进行了一些格式化。但要执行格式化,需要Tag属性。标签本身绑定到Multiconverter的输出。
但我的问题是,在将Tag绑定到Multibinding的输出之前执行FNamePropertChangedCallback。因此,当触发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>
Btw:有人知道怎么写local:MainWindow.FInlineProperty="{Binding Name}
&#34;长形式?我试过<TextBlock.local:MainWindow.FInlinse>...</TextBlock.local:MainWindow.FInlinse>
,但编译器抱怨它。
更新25.Feb.2017:
我做了你的建议并将所有内容绑定到我的附属财产。
<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以获取所有数据,所以问题是,当绑定对象本身时,如何强制绑定再次执行(引用)没有改变,但内部确实发生了变化?
答案 0 :(得分:1)
您binding
和AttachedProperty
属性之间实际需要TextBlock.Tag
,以便在AttachedProperty
更改时设置Tag
。但由于您还绑定了Name
,因此我建议您使用MultiBinding
AP
使用Name
和Tag
绑定,因此不依赖Tag
1}}。
答案 1 :(得分:0)
在设置附加属性之前,尝试设置Tag
属性。这意味着您还应该使用元素语法设置附加属性:
<TextBlock TextWrapping="WrapWithOverflow">
<TextBlock.Tag>
<MultiBinding Converter="{StaticResource TupleConverter}">
<Binding />
<Binding ElementName="Window"/>
</MultiBinding>
</TextBlock.Tag>
<local:MainWindow.FInlineProperty>
<Binding Path="Name" />
</local:MainWindow.FInlineProperty>
</TextBlock>