WPF影响数据绑定的顺序?

时间:2017-02-25 01:31:22

标签: c# wpf data-binding

我创建了一个具有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以获取所有数据,所以问题是,当绑定对象本身时,如何强制绑定再次执行(引用)没有改变,但内部确实发生了变化?

2 个答案:

答案 0 :(得分:1)

bindingAttachedProperty属性之间实际需要TextBlock.Tag,以便在AttachedProperty更改时设置Tag。但由于您还绑定了Name,因此我建议您使用MultiBinding AP使用NameTag绑定,因此不依赖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>