以下 DataTemplate.DataTrigger
は、年齢が等しい 30の場合、赤で表示します。
より大きい 30の場合、年齢を赤で表示するにはどうすればよいですか?
<DataTemplate DataType="{x:Type local:Customer}">
<Grid x:Name="MainGrid" Style="{StaticResource customerGridMainStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="150"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0" Text="First Name" Margin="5"/>
<TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding FirstName}" Margin="5"/>
<TextBlock Grid.Column="0" Grid.Row="1" Text="Last Name" Margin="5"/>
<TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding LastName}" Margin="5"/>
<TextBlock Grid.Column="0" Grid.Row="2" Text="Age" Margin="5"/>
<TextBlock x:Name="Age" Grid.Column="1" Grid.Row="2" Text="{Binding Age}" Margin="5"/>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Age}">
<DataTrigger.Value>30</DataTrigger.Value>
<Setter TargetName="Age" Property="Foreground" Value="Red"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
IValueConverter
に基づいて整数をブール値に変換するCutOff
を作成できます。その後、True
のDataTrigger.Value
(または返すものに応じてFalse
)を使用します。
正しく覚えていれば、WPF DataTrigger
sは厳密に等価比較器です。
次のようなもの:
public class CutoffConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
return ((int)value) > Cutoff;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
throw new NotImplementedException();
}
public int Cutoff { get; set; }
}
次に、次のXAMLを使用します。
<Window.Resources>
<myNamespace:CutoffConverter x:Key="AgeConverter" Cutoff="30" />
</Window.Resources>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Age,
Converter={StaticResource AgeConverter}}">
<DataTrigger.Value>true</DataTrigger.Value>
<Setter TargetName="Age" Property="Foreground" Value="Red"/>
</DataTrigger>
</DataTemplate.Triggers>
Age IValueConverter
のForeground
要素にバインドするためにTextBlock
を使用し、そこで色付けロジックを分離することをお勧めします。
<TextBlock x:Name="Age" Grid.Column="1" Grid.Row="2" Text="{Binding Age}" Foreground="{Binding Path=Age, Converter={StaticResource AgeToColorConverter}}" Margin="5"/>
次に、コードで:
[ValueConversion(typeof(int), typeof(Brush))]
public class AgeToColorConverter : IValueConverter
{
public object Convert(object value, Type target)
{
int age;
Int32.TryParse(value.ToString(), age);
return (age >= 30 ? Brushes.Red : Brushes.Black);
}
}
MVVMとINotifyPropertyChanged
の機能を使用して、目標を達成するより簡単な方法があると思います。
Age
プロパティを使用して、IsAgeValid
というブール値になる別のプロパティを作成します。 IsAgeValid
は、単純にオンデマンドチェックであり、技術的にはOnNotify
呼び出しを必要としません。どうやって?
Xamlにプッシュされた変更を取得するには、代わりにOnNotifyPropertyChanged
セッター内にIsAgeValid
のAge
を配置します。
IsAgeValid
へのバインディングには、Age
の変更時に通知メッセージが送信されます。これは実際に見られているものです。
セットアップしたら、もちろんIsAgeValid
の結果に応じてスタイルトリガーをfalseおよびtrueにバインドします。
public bool IsAgeValid{ get { return Age > 30; } }
public int Age
{
get { return _Age; }
set
{
_Age=value;
OnPropertyChanged("Age");
OnPropertyChanged("IsAgeValid"); // When age changes, so does the
// question *is age valid* changes. So
// update the controls dependent on it.
}
}
可能であれば、モデルにプロパティを追加できます。これが最も簡単な方法です。例えば。
public int AgeBoundry
{
get
{
if (Age < 30)
return 0;
else if (Age == 30)
return 1;
else
return 2;
}
}
その後、整数の値を確認できます。
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Age}">
<DataTrigger.Value>0</DataTrigger.Value>
<Setter TargetName="Age" Property="Foreground" Value="Green"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Age}">
<DataTrigger.Value>1</DataTrigger.Value>
<Setter TargetName="Age" Property="Foreground" Value="Orange"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Age}">
<DataTrigger.Value>2</DataTrigger.Value>
<Setter TargetName="Age" Property="Foreground" Value="Red"/>
</DataTrigger>
</DataTemplate.Triggers>