如果等于 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>
答案 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;
}
}