كيفية الحصول على datatemplate.datatrigger للتحقق من أكبر من أو أقل من؟
-
16-09-2019 - |
سؤال
ما يلي 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
. وبعد ثم استخدام DataTrigger.Value
من True
(أو 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>
نصائح أخرى
أود أن أوصي باستخدام 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
setter بدلا من ذلك.
أي ملزمة ل IsAgeValid
سيكون لديك رسالة إخطار المرسلة على أي Age
التغيير الذي هو حقا ما يجري النظر إليه.
بمجرد الإعداد، بالطبع ربط الزناد النمط عن FALSE وصحيح وفقا لذلك IsAgeValid
نتيجة.
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>