WPF标签样式触发器基于标签内容中未知索引处的char,是否可能?

时间:2011-01-28 06:58:04

标签: wpf xaml styles

当表单上字段的要求发生变化时,不是以编程方式设置样式,而是可以使用一个触发器来检查Label.Contents中的最后一个字符是一个'*',如果这样设置了一个属性,标签

这样的东西但是如何检查Content属性的最后一个字符?

  <Style x:Key="LabelStandard" TargetType="Label">
    <Setter Property="HorizontalAlignment"      Value="Left"/>
    <Setter Property="VerticalAlignment"        Value="Top"/>
    <Style.Triggers>
        <Trigger Property="Content" Value="*"> <!-TODO only check the last char -->
            <Setter Property="Foreground"      Value="Red"/>
        </Trigger>
    </Style.Triggers>
  </Style>

1 个答案:

答案 0 :(得分:3)

我认为你必须使用转换器。尝试使用类似的东西

<Style x:Key="LabelStandard" TargetType="Label">
    <Setter Property="HorizontalAlignment"      Value="Left"/>
    <Setter Property="VerticalAlignment"        Value="Top"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource self},
                                       Path=Content,
                                       Converter={StaticResource LastCharConverter},
                                       ConverterParameter=*}"
                     Value="True">
            <Setter Property="Foreground" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
public class LastCharConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
        {
            return false;
        }
        string content = value.ToString();
        if (content.Length > 0 &&
            content[content.Length - 1] == (char)parameter)
        {
            return true;
        }
        return false;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

更新

只要您知道其位置,就可以绑定Content字符串中的任何给定字符。

<Style x:Key="LabelStandard" TargetType="Label">
    <Setter Property="HorizontalAlignment"      Value="Left"/>
    <Setter Property="VerticalAlignment"        Value="Top"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource self},
                                       Path=(Content)[2]}"
                        Value="*">
            <Setter Property="Foreground" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

但是如果你的字符串长度会有所不同(我认为是这种情况),那对你来说不会很好,因为你无法绑定绑定中的[2](以我知道的任何方式)的)。

除此之外,我认为你必须在你自己指出的时候做一个代码隐藏的代码