WPF自定义控件“样式模型”

时间:2013-01-07 16:10:22

标签: c# wpf styles ivalueconverter

我在wpf中有自定义控件,它根据一个属性改变了他的外观:

...

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

在代码中我有属性AlarmLevel,当AlarmLevel大于5时我希望填充为红色,否则为蓝色。 我怎样才能做到这一点。 (我不希望暴露填充属性)

TNX

1 个答案:

答案 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。