2016-05-13 9 views
0

Ich habe einen Wert, der als OperativeCount bezeichnet wird. Ich möchte die Farbe der DataGridColumn ändern, wenn diese Zahl größer als 10 ist. Etwas Ähnliches zu diesem;DataTrigger Wenn größer als eine Zahl

<DataGrid.Resources> 
    <Style x:Key="DGCellStyle" TargetType="DataGridCell"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding OperativeCount}" Value=">10"> 
       <Setter Property="FontWeight" Value="Bold"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.Resources> 

Offensichtlich jetzt die Value=">10" funktioniert nicht, aber im Wesentlichen das ist, was ich tun möchte.

+0

können Sie bitte eine der Antworten als die richtige? Oder kannst du uns sagen, was falsch ist oder fehlt? Dies kann ein nützliches Feedback für uns und auch für andere SO-Benutzer sein, die diese Frage sehen. –

Antwort

1

Dafür benötigen Sie einen Wertkonverter. Hier ist, wie Sie vielleicht, dass schreiben, wenn Sie waren mir:

using System; 
using System.Globalization; 
using System.Windows.Data; 
using System.Windows.Markup; 

namespace EdPlunkett 
{ 
    public class GreaterThan : MarkupExtension, IValueConverter 
    { 
     // The only public constructor is one that requires a double argument. 
     // Because of that, the XAML editor will put a blue squiggly on it if 
     // the argument is missing in the XAML. 
     public GreaterThan(double opnd) 
     { 
      Operand = opnd; 
     } 

     /// <summary> 
     /// Converter returns true if value is greater than this. 
     /// 
     /// Don't let this be public, because it's required to be initialized 
     /// via the constructor. 
     /// </summary> 
     protected double Operand { get; set; } 

     // When the XAML is parsed, each markup extension is instantiated 
     // and the parser asks it to provide its value. Here, the value is 
     // us. 
     public override object ProvideValue(IServiceProvider serviceProvider) 
     { 
      return this; 
     } 

     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return System.Convert.ToDouble(value) > Operand; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

Und hier ist, wie Sie es verwenden würde:

<Window 
    .... 
    xmlns:edp="clr-namespace:EdPlunkett" 
    .... 
    > 

    <DataGrid.Resources> 
     <Style x:Key="DGCellStyle" TargetType="DataGridCell"> 
      <Style.Triggers> 
       <DataTrigger 
        Binding="{Binding OperativeCount, Converter={edp:GreaterThan 10}}" 
        Value="True"> 
        <Setter Property="FontWeight" Value="Bold" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.Resources> 

Wertwandler sind sehr häufig als Ressourcen instanziert und Parameter für sie sind in der Regel übergeben über die Eigenschaft ConverterParameter, aber wenn Sie es zu einem MarkupExtension machen, kann der XAML-Parser den Typ des Arguments erzwingen und das Argument als vorhanden voraussetzen. Dies macht die Eingeweide des Konverters äußerst einfach. Außerdem bekommst du Intellisense dazu.

0

Wenn Sie diese Komponente nicht erneut verwenden oder als "allgemein" definieren müssen, kann eine einfachere und am besten fokussierte Lösung die folgende sein.

einen Konverter mit diesem Code erstellen:

using System; 
using System.Globalization; 
using System.Windows; 
using System.Windows.Data; 

namespace WpfApplication1 
{ 
    public class CountToFontWeightConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value == null) 
       return DependencyProperty.UnsetValue; 

      var count = (int)value; 

      if (count > 10) 
       return FontWeights.Bold; 
      else 
       return FontWeights.Normal; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

Und es dann auf diese Weise verwenden:

<DataGrid.Resources> 

    <local:CountToFontWeightConverter x:Key="CountToFontWeightConverter"/> 

    <Style TargetType="{x:Type DataGridCell}" x:Key="DGCellStyle"> 
    <Setter Property="FontWeight" 
      Value="{Binding OperativeCount, 
       Converter={StaticResource CountToFontWeightConverter}}"/> 
    </Style> 

</DataGrid.Resources> 

Offensichtlich, wenn die OperativeCount Eigenschaftsänderungen während der Laufzeit Ihrer App, es Mitteilungen über die Änderungen erhöhen müssen , über INotifyPropertyChanged Implementierung oder über Reactive Bibliothek.

Sie können diese Lösung ein wenig verallgemeinern, indem Sie das Limit von 10 als Parameter für den Konverter übergeben, anstatt ihn im Konverter selbst fest zu codieren, damit Sie ihn an mehreren Stellen mit anderem Limit verwenden können.

2

Blend SDK für WPF kann es sehr schnell ohne Code hinter sich bringen. Schau dir DataTrigger (Blend SDK for WPF) an. Verwenden Sie ChangePropertyAction als das Verhalten.

<ei:DataTrigger Binding="{Binding OperativeCount}" Comparison="GreaterThan" Value="10"> 
    <ei:ChangePropertyAction PropertyName="FontWeight" > 
    <ei:ChangePropertyAction.Value> 
     <FontWeight>Bold</FontWeight> 
    </ei:ChangePropertyAction.Value> 
    </ei:ChangePropertyAction> 
</ei:DataTrigger> 

Stören Sie nicht viel, lassen Sie Blend sich darum kümmern.

+0

Es war sehr schwer für mich, die Software zu finden, also hier ist die relevantesten Links zu dem Moment: https://www.microsoft.com/en-us/download/details.aspx?id=5915 und https://www.microsoft.com/en-us/download/details.aspx?id=10801 . Bitte finden Sie einige neue (aber unklare!) Informationen aus der "Übersicht" in der ersten URL verlinkt! –

+0

Sie beziehen sich auf die ältere Version von Expression Studio. Das Expression Studio ist jetzt deaktiviert und Expression Blend wurde in Visual Studio integriert. Holen Sie sich einfach die Community Edition von Visual Studio. –