0

下面的数据触发器不起作用。知道为什么不?
我检查了后面的代码,两种情况下的 LineCount 分别为 1 和 4。
但是当我将 Value 更改为“-1”时,触发器正在工作。
那么为什么 LineCount 总是-1?

<TextBox x:Name="TextInfo" TextWrapping="Wrap" Text="Information" HorizontalAlignment="Stretch" Foreground="OrangeRed">
    <TextBox.Style>
        <Style TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding LineCount, ElementName=TextInfo}" Value="4">
                    <Setter Property="Background" Value="Green" />
                </DataTrigger>
                <DataTrigger Binding="{Binding LineCount, ElementName=TextInfo}" Value="1">
                    <Setter Property="Background" Value="PowderBlue" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>
4

4 回答 4

2

查看 MSDN 上的TextBox.LineCountProperty页面,我们可以看到它不是DependencyProperty. 此外,由于TextBox该类没有实现INotifyPropertyChanged接口,我只能想象这个属性的值永远不会在 a 中为您更新,Binding只能在代码中使用。

我可以看到您使用此属性的唯一方法是您创建一个Attached Property来访问它并公开更新的值。

于 2013-11-01T13:50:11.407 回答
1

快速反编译TextBox代码表明它LineCount不是DependencyProperty. 因此,当值更新时,它不会更新您的触发器。

这是C#LineCount中类的属性。System.Windows.Controls.TextBox您可以在这里看到没有DependencyProperty支持该属性。

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int LineCount
{
  get
  {
    if (this.RenderScope == null)
      return -1;
    else
      return this.GetLineIndexFromCharacterIndex(this.TextContainer.SymbolCount) + 1;
  }
}

这个问题的答案是创建附加属性的一个不错的解决方案,该属性将观察何时TextBox修改文本,并给出当前行位置。您可以更改绑定以侦听附加属性。

于 2013-11-01T13:52:09.610 回答
0

你不需要ElementName,使用RelativeSource

<DataTrigger Binding="{Binding LineCount, RelativeSource={RelativeSource Self}}" Value="4">
于 2013-11-01T13:24:47.830 回答
0

TextBox的LineCount属性可用于检索TextBox中的当前文本行数。如果文本换行成多行,此属性将反映用户看到的可见换行数。

<TextBox x:Name="TextInfo" Text="Information" HorizontalAlignment="Stretch" Foreground="OrangeRed" **TextWrapping="Wrap"**>
    <TextBox.Style>
     ....
    </TextBox.Style>
</TextBox>
于 2013-11-01T13:29:15.740 回答