【问题标题】:WPF influencing the order of databinding?WPF影响数据绑定的顺序?
【发布时间】: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}" 写成长格式吗?我试过&lt;TextBlock.local:MainWindow.FInlinse&gt;...&lt;/TextBlock.local:MainWindow.FInlinse&gt;,但编译器抱怨它。


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


【解决方案1】:

您真正想要的是AttachedPropertyTextBlock.Tag 属性之间的binding,以便在Tag 更改时设置AttachedProperty。但是由于您还绑定到Name,所以我建议使用AP 使用AP 绑定NameTag,因此根本不依赖于Tag

【讨论】:

    【解决方案2】:

    尝试在设置附加属性之前设置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>
    

    【讨论】:

      猜你喜欢
      • 2010-11-11
      • 2012-08-04
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 2017-01-10
      相关资源
      最近更新 更多