我在wpf中有自定义控件,它根据一个属性改变了他的外观:
...
<Grid>
<Rectangle Fill="[Something]" />
</Grid>
在代码中我有属性AlarmLevel,当AlarmLevel大于5时我希望填充为红色,否则为蓝色。 我怎样才能做到这一点。 (我不希望暴露填充属性)
TNX
答案 0 :(得分:2)
由于你的填充值基于不等式,你可以通过几种方式实现这一点。
推荐的方法可能是在绑定上使用转换器使其成为布尔值。然后使用数据触发器根据值是true还是false来设置填充值,如下所示:
<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”的“helper”布尔属性。它看起来像是:
public bool IsAlarming {
get { return AlarmLevel > 5; }
}
然后,您将数据触发器绑定到IsAlarming而不是AlarmLevel。 这不推荐,因为它不是纯粹的MVVM。