【问题标题】:Data Trigger using Converter not working使用转换器的数据触发不起作用
【发布时间】:2011-12-05 03:50:22
【问题描述】:

我正在尝试根据它的值更新文本块的颜色。看起来很简单,但不起作用。

这是文本块 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 到达转换器?
  • 是的,转换器启动
  • 你的文本块的文本是什么,你的转换器重新调整了什么值?
  • 文本是双数,与recd相同。由转换器。转换器根据值是否大于 0 返回真或假。调试转换器时看起来不错。

标签: c# wpf converter datatrigger


【解决方案1】:
<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>

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

【讨论】:

  • 您的 Text 值是否总是双精度值?如果不是,转换器代码可能会在这一行中断 - if (System.Convert.ToDouble(value) >= 0) return true;
  • 不,在那之前我有支票。如果(值 == 空)返回假; if (value.ToString().Length == 0) 返回 false;
  • 但是如果文本将是字符串说“测试”在这种情况下它会绕过你的两个条件,它不会被转换为双值!!
  • 极不可能,文本必须输入 double。输出窗口中没有第一次机会异常或任何奇怪的东西。
  • 请看我的回答,它现在应该可以工作了。您需要在样式设置器中设置 Foreground 属性。
【解决方案2】:

在指定转换器时,您的花括号中似乎缺少 StaticResource:

Converter={StaticResource converters:ColorConverter}

【讨论】:

  • 仍然不起作用,即使将转换器定义为静态资源并将转换器设置为其资源键。
【解决方案3】:

如果你想动态改变属性值,那么对应的属性必须只保留在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 和 Setter 标记中。准确地说,您的示例删除了我的代码中给出的 TextBlock 标记内的 Foreground 属性。

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多