1

1 つのプロパティに基づいて外観を変更する wpf のカスタム コントロールがあります。

...

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

コードには、プロパティ AlarmLevel があります。AlarmLevel が 5 より大きい場合は、塗りつぶしを赤、それ以外の場合は青にします。これどうやってするの。(fill プロパティを公開したくない)

TNX

4

1 に答える 1

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」などと呼ばれる「ヘルパー」ブール プロパティを作成することもできます。次のようになります。

public bool IsAlarming {
  get { return AlarmLevel > 5; }
}

次に、データ トリガーを AlarmLevel ではなく IsAlarming にバインドします。 ただし、これは純粋な MVVM ではないため、お勧めしません。

于 2013-01-07T16:33:07.523 に答える