2013-01-07 155 views
1

我在WPF自定义控件基于一个属性,它改变了他的样子:WPF自定义控件“风格模式”

...

<Grid> 
    <Rectangle Fill="[Something]" /> 
</Grid> 

在代码中,我的财产警报等级,当警报等级是大于5我想填充为红色,否则为蓝色。 我该怎么做。 (我不希望被曝光的填充属性)

TNX

+0

您可以实现它每次更改检查值,并从那里走时INotifyPropertyChanged接口。 http://msdn.microsoft.com/en-us/library/ms743695.aspx – Botonomous

+2

您将需要一个ValueConverter(的IValueConverter)来做到这一点。如果您在本网站上搜索IValueConverter,会有很多结果来显示应该如何实施。 – Stewbob

回答

2

既然你在一个不平等的基础填充值,你可以这样做一对夫妇的方式。

推荐的方法可能是使用一个转换器上的结合,使之成为一个布尔值。然后使用数据触发设置基础上的值是否是真还是假,像这样的填充值:

<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