WPF文本块文本和DataTrigger

时间:2013-07-04 13:05:58

标签: wpf

我有一个名为TextBlock的{​​{1}}。我有Price可行。

DataTrigger

所以这意味着如果<DataTrigger Binding="{common:ComparisonBinding DataContext.Discount,GT,0}" Value="{x:Null}"> <DataTrigger.Setters> <Setter Property="Text" TargetName="price"> <Setter.Value> <Run>Value1</Run> <Run>Value2</Run> </Setter.Value> </Setter> </DataTrigger.Setters> </DataTrigger> 它应该显示为Discount is > 0在这里运行不起作用。我需要绑定,因为我需要不同的文本样式。

2 个答案:

答案 0 :(得分:2)

正如xaml和@BasBrekelmans中的错误所说,您尝试将Run元素分配给期望string的属性。

根据您的要求,只需使用MultiBindingStringFormat将您的绑定值格式化为所需的格式。

类似的东西:

<DataTrigger Binding="{common:ComparisonBinding DataContext.Discount,GT,0}"
              Value="{x:Null}">
    <Setter TargetName="price"
            Property="Text">
      <Setter.Value>
        <MultiBinding StringFormat="Some Custom Formatted Text Value1: {0} and Value2: {1}">
          <Binding Path="BindingValue1" />
          <Binding Path="BindingValue2" />
        </MultiBinding>
      </Setter.Value>
    </Setter>
</DataTrigger>

如果它是TextBlock的视觉样式,你试图使用内联绑定进行调整,那么你最好用一个更好的元素修改你的控件的模板而不是单个TextBlock来允许它。

但是,您可以使用转换器并将DataTrigger.Setter应用于TextBlock.Tag

来解决问题

说出类似的话:

public class TextBlockInlineFormatConverter : IMultiValueConverter {
  public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
    if (values.Length < 3)
      return null;
    TextBlock textblock = values[0] as TextBlock;
    if (textblock == null)
      return null;
    textblock.ClearValue(TextBlock.TextProperty);
    textblock.Inlines.Add(new Run("Some text ") { Foreground = Brushes.Tomato });
    textblock.Inlines.Add(new Run(values[1].ToString()) { Foreground = Brushes.Blue });
    textblock.Inlines.Add(new Run(" and Some other text ") { Foreground = Brushes.Tomato });
    textblock.Inlines.Add(new Run(values[2].ToString()) { Foreground = Brushes.Blue, FontWeight = FontWeights.Bold });
    return textblock.Tag;
  }

  public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) {
    throw new NotImplementedException();
  }
}

和用法:

<DataTrigger Binding="{common:ComparisonBinding DataContext.Discount,GT,0}"
              Value="{x:Null}">
    <!-- Note the setter is on Tag and not Text since we modify the Text using Inlines within the converter -->
    <Setter TargetName="price"
            Property="Tag">
      <Setter.Value>
        <MultiBinding Converter="{StaticResource TextBlockInlineFormatConverter}"
                      Mode="OneWay">
          <Binding Path="."
                   RelativeSource="{RelativeSource Self}" />
          <Binding Path="BindingValue1" />
          <Binding Path="BindingValue2" />
        </MultiBinding>
      </Setter.Value>
    </Setter>
</DataTrigger>

只有在限制修改控件的模板tbh时才使用解决方法。

答案 1 :(得分:1)

Run项的集合无法应用于Text属性,这是一个字符串。正确的属性是Inlines

不幸的是,这个属性没有setter,应该有一种不同的解决方法,例如: ContentControl中有两个TextBlock的{​​{1}}。