2010-12-07 7 views
2

datatriggers繰り返し使用:WPF私は現在DataTrigger持っ

<DataTrigger Binding="{Binding HeaderType}" Value="1"> 
    <Setter Property="BorderThickness" Value="5"/></DataTrigger> 

私は2-100

は、私がデータトリガー99回をコピーする必要がまたは多分ありますない値と同じことをやってみたいですもっといい方法 ?

答えて

3

をtrueまたはfalseを返す:

public bool HasImportantHeader // or something... 
{ 
    get { return HeaderType >=1 && HeaderType <= 100; } 
} 

使用することをデータトリガーのプロパティ:

<DataTrigger Binding="{Binding HasImportantHeader}" Value="True"> 
    <Setter Property="BorderThickness" Value="5"/> 
</DataTrigger> 

一般的に、私はXAMLをできるだけシンプルに保ち、すべてのロジックをビューモデルに入れて、コンバータが絶対に必要でない限り使用しないようにします。

のはあなたがヘッダータイプがジャスト再利用HasImportantHeaderプロパティ1〜100であることを示すために太字を使用する別のビュー、のようなものを追加しましょう:あなた、

その後
<DataTrigger Binding="{Binding HasImportantHeader}" Value="True"> 
    <Setter Property="FontWeight" Value="Bold"/> 
</DataTrigger> 

をまでのすべてのヘッダータイプに太い枠線と太字のテキストを含める必要があると判断することがあります。 HasImportantHeaderプロパティの実装を変更するのは簡単なことです。

+0

良い解決策。 「範囲内の値ですか?」状態です。表示は物事を視覚化するためのものであり、状態を保持するものではありません。 – rooks

1

この目的のためにコンバーターを使用する必要があります。DataTriggerにコンバーターを追加することができます。 Converterを使用すると、値を渡してtrueまたはfalseを返すことができます。

<DataTrigger 
    Binding="{Binding HeaderType, Converter={StaticResource RengeConvertor}}" 
    Value="true" 
    > 
    <Setter Property="BorderThickness" Value="5" /> 
</DataTrigger> 

とあなたのコンバータが

public class RengeConvertor : IValueConverter 

{

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 

{ 

    int data = (int)value; 

    if (data >= 2 && data <= 100) 

     return true; 

    else 

     return false; 

} 

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 

{ 

    throw new NotImplementedException(); 

} 

}

ようになるはずですまた、私は「この興味深いhttp://zamjad.wordpress.com/2010/07/29/range-converter/

+0

おかげさまで、私はViewModelと新しいConverterに新しいコレクションを関与させずにXAMLによる解決方法を知りたいと思います。 (Microsoftがどのようにしてオペランドを表すプロパティを公開しなかったか) – Erez

+0

私はあなたの要件のための任意のxamlの方法があるとは思わない。 – biju

2

を見つけることができますあなたのビューモデルにプロパティを追加

<DataTrigger Binding="{Binding HeaderType, 
           Converter={StaticResource RangeConverter}, 
           ConverterParameter=1-100}" 
      Value="True"> 
    <Setter Property="BorderThickness" Value="5"/> 
</DataTrigger> 

似たような状況

でこれを使用しましコンバータでは、我々は範囲に応じて、

public class RangeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string[] ranges = parameter.ToString().Split(new char[]{'-'}); 
     int headerType = (int)value; 
     if (headerType >= System.Convert.ToInt32(ranges[0]) && 
      headerType <= System.Convert.ToInt32(ranges[1])) 
     { 
      return true; 
     } 
     return false; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
}