使用转换器的数据触发器无法正常工作

4

我将尝试根据文本块的值更新其颜色。看起来很简单,但实际上并没有奏效。

以下是文本块XAML代码:

 <TextBlock 
        Grid.Column="1" 
        Grid.Row="1" 
        Text="{Binding Path=GL, StringFormat={}{0:N0}}" 
        HorizontalAlignment="Left" 
        FontFamily="Verdana" 
        Foreground="Tomato" 
        FontWeight="Bold"             
        VerticalAlignment="Center"
        Margin="5,2,5,0"
        FontSize="18"
        >
        <TextBlock.Resources>
            <converters:ColorConverter x:Key="CoConverter"></converters:ColorConverter>
        </TextBlock.Resources>
      <TextBlock.Style>
          <Style>
              <Style.Triggers>
                  <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text, Converter={StaticResource ResourceKey=CoConverter}}" Value="true">
                  <Setter Property="TextBlock.Foreground" Value="LimeGreen" />
                      </DataTrigger>
              </Style.Triggers>
          </Style>
      </TextBlock.Style>

这里是转换器。
public class ColorConverter : MarkupExtension, IValueConverter
{

    #region IValueConverter Members

    public object Convert(object value, 
        Type targetType, 
        object parameter, 
        System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return false;
        if (value.ToString().Length == 0)
            return false;
        if (System.Convert.ToDouble(value) >= 0)
            return true;

        return false;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

转换器看起来不错,但是由于某些原因触发器没有生效。


你尝试过什么?你设置了断点并看到从XAML到转换器的流程吗? - Amittai Shapira
是的,转换器已经触发。 - Rauld
你的文本块的文本是什么?你的转换器返回什么值? - Rohit Vats
文本是双精度数字,与转换器接收到的相同。转换器根据值是否大于0返回true或false。在调试转换器时看起来很好。 - Rauld
3个回答

9
<TextBlock 
        Grid.Column="1" 
        Grid.Row="1" 
        Text="{Binding Path=GL, StringFormat={}{0:N0}}" 
        HorizontalAlignment="Left" 
        FontFamily="Verdana"
        FontWeight="Bold"             
        VerticalAlignment="Center"
        Margin="5,2,5,0"
        FontSize="18"
        >
        <TextBlock.Resources>
            <converters:ColorConverter x:Key="CoConverter"></converters:ColorConverter>
        </TextBlock.Resources>
      <TextBlock.Style>
          <Style>
              <Setter Property="TextBlock.Foreground" Value="Tomato" />
              <Style.Triggers>
                  <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text, Converter={StaticResource ResourceKey=CoConverter}}" Value="true">
                  <Setter Property="TextBlock.Foreground" Value="LimeGreen" />
                      </DataTrigger>
              </Style.Triggers>
          </Style>
      </TextBlock.Style>

您需要在样式中设置前景属性,以便在运行时动态更改它。

1
你的文本值是否总是一个双精度浮点数?如果不是,转换器代码可能会在这一行出错 - 如果(System.Convert.ToDouble(value) >= 0) 返回真。 - Rohit Vats
不,这之前我有检查。如果(value == null)就返回false;如果(value.ToString().Length == 0)也返回false。 - Rauld
但是,如果文本是字符串,比如说“Test”,那么它将绕过您的两个条件,并且不会被转换为双精度值! - Rohit Vats
我能看一下你应用这种样式的文本块吗?因为对我来说,它运行得很好,就像我发布的那样。 - Rohit Vats
2
请查看我的答案,现在应该可以工作了。您需要在样式设置器中设置前景属性。 - Rohit Vats
显示剩余2条评论

1

看起来在指定转换器时,你的花括号内缺少 StaticResource:

Converter={StaticResource converters:ColorConverter}

即使将转换器定义为静态资源并将其设置为其资源键,仍然无法正常工作。 - Rauld

0

如果您想要动态更改属性值,那么相应的属性必须仅保留在Setter标签中。

<TextBlock>
  <TextBlock.Style>
      <Style>
          <Setter Property="TextBlock.Foreground" Value="Tomato" />
          <Style.Triggers>
              <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text, Converter={StaticResource ResourceKey=CoConverter}}" Value="true">
              <Setter Property="TextBlock.Foreground" Value="LimeGreen" />
                  </DataTrigger>
          </Style.Triggers>
      </Style>
</TextBlock.Style>

但不是在和标签中都要删除。对于您的示例,确切地按照我的代码中所给出的方法删除TextBlock标签内的Foreground属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接