كيفية الحصول على datatemplate.datatrigger للتحقق من أكبر من أو أقل من؟

StackOverflow https://stackoverflow.com/questions/793926

سؤال

ما يلي 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. DataTriggerS هي المساواة بدقة المقارنات إذا كنت أتذكر بشكل صحيح.

لذلك شيء مشابه ل:

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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top