我在 wpf 中有自定义控件,可以根据一个属性更改他的外观:
...
<Grid>
<Rectangle Fill="[Something]" />
</Grid>
在代码中,我有属性 AlarmLevel,当 AlarmLevel 大于 5 时,我希望填充为红色,否则为蓝色。我怎样才能做到这一点。(我不希望填充属性被暴露)
肿瘤坏死因子
我在 wpf 中有自定义控件,可以根据一个属性更改他的外观:
...
<Grid>
<Rectangle Fill="[Something]" />
</Grid>
在代码中,我有属性 AlarmLevel,当 AlarmLevel 大于 5 时,我希望填充为红色,否则为蓝色。我怎样才能做到这一点。(我不希望填充属性被暴露)
肿瘤坏死因子
由于您将填充值基于不等式,因此您可以通过多种方式执行此操作。
推荐的方法可能是在绑定上使用转换器将其转换为布尔值。然后使用数据触发器根据值是真还是假来设置填充值,如下所示:
<Rectangle>
<Rectangle.Style>
<Style TargetType="Rectangle">
<Style.Triggers>
<DataTrigger Binding="{Binding AlarmLevel, Converter={StaticResource AlarmLevelConverter}}" Value="True">
<Setter Property="Fill">
<Setter.Value>
<SolidColorBrush Color="Red" />
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding AlarmLevel, Converter={StaticResource AlarmLevelConverter}}" Value="False">
<Setter Property="Fill">
<Setter.Value>
<SolidColorBrush Color="Black" />
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
</Rectangle>
您的转换器可能看起来像(也许有更多的异常处理):
public class AlarmLevelConverter: IValueConverter {
public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) {
return ((int)(value) > 5);
}
public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) {
throw new NotSupportedException();
}
}
不要忘记您需要添加对转换器类的引用作为用户控件上的资源:
如果您想放弃转换器方法,您还可以在数据上下文中创建一个“帮助”布尔属性,称为“IsAlarming”。它看起来像:
public bool IsAlarming {
get { return AlarmLevel > 5; }
}
然后,您将数据触发器绑定到 IsAlarming 而不是 AlarmLevel。 但不建议这样做,因为它不是纯 MVVM。