1

我在 wpf 中有自定义控件,可以根据一个属性更改他的外观:

...

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

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

肿瘤坏死因子

4

1 回答 1

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。

于 2013-01-07T16:33:07.523 回答