如何让DataTemplate.DataTrigger检查大于或小于?

时间:2009-04-27 15:02:55

标签: wpf xaml datatemplate datatrigger

如果等于 30,则以下DataTemplate.DataTrigger会使年龄显示为红色。

如果大于 30?

,如何将年龄显示设为红色?
<DataTemplate DataType="{x:Type local:Customer}">
    <Grid x:Name="MainGrid" Style="{StaticResource customerGridMainStyle}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100"/>
            <ColumnDefinition Width="150"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBlock Grid.Column="0" Grid.Row="0" Text="First Name" Margin="5"/>
        <TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding FirstName}" Margin="5"/>
        <TextBlock Grid.Column="0" Grid.Row="1" Text="Last Name" Margin="5"/>
        <TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding LastName}" Margin="5"/>
        <TextBlock Grid.Column="0" Grid.Row="2" Text="Age" Margin="5"/>
        <TextBlock x:Name="Age" Grid.Column="1" Grid.Row="2" Text="{Binding Age}" Margin="5"/>
    </Grid>

    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=Age}">
            <DataTrigger.Value>30</DataTrigger.Value>
            <Setter TargetName="Age" Property="Foreground" Value="Red"/> 
        </DataTrigger>
    </DataTemplate.Triggers>

</DataTemplate>

4 个答案:

答案 0 :(得分:70)

您可以创建IValueConverter,它会根据CutOff将整数转换为布尔值。然后使用DataTrigger.Value的{​​{1}}(或True,具体取决于您要返回的内容。)

如果我没记错的话,WPF False是严格的相等比较器。

类似于:

DataTrigger

然后使用以下XAML。

public class CutoffConverter : IValueConverter {
    object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        return ((int)value) > Cutoff;
    }

    object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        throw new NotImplementedException();
    }

    public int Cutoff { get; set; }
}

答案 1 :(得分:11)

我建议使用IValueConverter绑定到Age Foreground的{​​{1}}元素并隔离那里的着色逻辑。

TextBlock

然后在代码中:

<TextBlock x:Name="Age" Grid.Column="1" Grid.Row="2" Text="{Binding Age}" Foreground="{Binding Path=Age, Converter={StaticResource AgeToColorConverter}}" Margin="5"/>

答案 2 :(得分:9)

我相信使用MVVM和INotifyPropertyChanged的强大功能可以更简单地实现目标。


使用Age属性创建另一个属性,该属性将是一个名为IsAgeValid的布尔值。 IsAgeValid只是一个按需检查,而技术上需要进行OnNotify调用。怎么样?

要将更改推送到Xaml,请将OnNotifyPropertyChanged IsAgeValid放在Age setter中。

IsAgeValid的任何绑定都会在任何Age更改时发送通知消息,这实际上是正在查看的内容。


设置完成后,当然会将样式触发器绑定为false和true,相应地IsAgeValid结果。

public bool IsAgeValid{ get { return Age > 30; } }

public int Age
{ 
  get { return _Age; }

  set
  {
   _Age=value;
   OnPropertyChanged("Age");   
   OnPropertyChanged("IsAgeValid"); // When age changes, so does the
                                    // question *is age valid* changes. So 
                                    // update the controls dependent on it.
   } 
 }

答案 3 :(得分:1)

如果可能的话,可以向模型中添加属性,这是最简单的方法。 例如

apt-get

然后您可以检查整数值。

public int AgeBoundry
{
    get
    {
        if (Age < 30)
            return 0;
        else if (Age == 30)
            return 1;
        else
            return 2;
    }
}