WPF自定义控件“风格模式”
问题描述:
我在WPF自定义控件基于一个属性,它改变了他的样子:WPF自定义控件“风格模式”
...
<Grid>
<Rectangle Fill="[Something]" />
</Grid>
在代码中,我的财产警报等级,当警报等级是大于5我想填充为红色,否则为蓝色。 我该怎么做。 (我不希望被曝光的填充属性)
TNX
答
既然你在一个不平等的基础填充值,你可以这样做一对夫妇的方式。
推荐的方法可能是使用一个转换器上的结合,使之成为一个布尔值。然后使用数据触发设置基础上的值是否是真还是假,像这样的填充值:
<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。
+0
这不是真的,后者'不是推荐的,它不是纯粹的MVVM'。这正是视图模型的目的 - 包含可以绑定到的属性。在纯MVVM中,你永远不需要转换器,因为所有的东西都已经存在于虚拟机中。从某种意义上说,视图模型是这种模式下的转换器,因为它们将模型数据转换为表示数据。 *这是推荐的做事方式。 – pbalaga
您可以实现它每次更改检查值,并从那里走时INotifyPropertyChanged接口。 http://msdn.microsoft.com/en-us/library/ms743695.aspx – Botonomous
您将需要一个ValueConverter(的IValueConverter)来做到这一点。如果您在本网站上搜索IValueConverter,会有很多结果来显示应该如何实施。 – Stewbob