以下DataTemplate.DataTrigger
使年龄显示为红色,如果它等于30。
如果年龄显示大于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>
您可以创建一个IValueConverter
,它根据CutOff
将整数转换为布尔值。然后使用DataTrigger.Value
的True
(或False
,取决于你要返回的内容)。
如果我没记错的话,WPF DataTrigger
s是严格的相等比较者。
所以类似于:
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; }
}
然后使用以下XAML。
<Window.Resources>
<myNamespace:CutoffConverter x:Key="AgeConverter" Cutoff="30" />
</Window.Resources>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Age,
Converter={StaticResource AgeConverter}}">
<DataTrigger.Value>true</DataTrigger.Value>
<Setter TargetName="Age" Property="Foreground" Value="Red"/>
</DataTrigger>
</DataTemplate.Triggers>
我建议使用IValueConverter
绑定到Age Foreground
的TextBlock
元素并隔离那里的着色逻辑。
<TextBlock x:Name="Age" Grid.Column="1" Grid.Row="2" Text="{Binding Age}" Foreground="{Binding Path=Age, Converter={StaticResource AgeToColorConverter}}" Margin="5"/>
然后在代码中:
[ValueConversion(typeof(int), typeof(Brush))]
public class AgeToColorConverter : IValueConverter
{
public object Convert(object value, Type target)
{
int age;
Int32.TryParse(value.ToString(), age);
return (age >= 30 ? Brushes.Red : Brushes.Black);
}
}
我相信通过使用MVVM和qazxsw poi的强大功能,可以更简单地实现目标。
使用INotifyPropertyChanged
属性创建另一个属性,它将是一个名为Age
的布尔值。 IsAgeValid
将只是一个按需检查,在技术上不需要IsAgeValid
呼叫。怎么样?
要将更改推送到Xaml,请将OnNotify
替换为OnNotifyPropertyChanged
setter中的IsAgeValid
。
任何与Age
的绑定都会在任何IsAgeValid
更改时发送通知消息,这实际上是正在查看的内容。
一旦设置,当然将样式触发器绑定为false和true,相应于Age
结果。
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.
}
}
那么你可以检查整数的值。
public int AgeBoundry
{
get
{
if (Age < 30)
return 0;
else if (Age == 30)
return 1;
else
return 2;
}
}