2010-06-25 6 views
3

Je tente de générer un DataGrid et je souhaite lier une propriété Foreground de TextColum à une date, afin qu'elle devienne rouge si la date est passée.Liaison au premier plan d'un texte DataGrid WPF Colonne

Voici le XAML:

<toolkit:DataGridTextColumn 
    Binding="{Binding Path=Prüfdatum, Converter={StaticResource TimestampToDateConverter}}" 
    Header="Prüfdatum" 
    Foreground="{Binding Path=Prüfdatum, Converter={StaticResource TimestampToColorConverter}, 
    ConverterParameter=Prüfdatum}" /> 

Voici mon Converter:

class TimestampToColorConverter: IValueConverter 
{ 
    #region IValueConverter Member 

    public object Convert(object value, Type targetType, 
      object parameter, System.Globalization.CultureInfo culture) 
    { 
     string Datum = value.ToString(); 
     int year = System.Convert.ToInt32(Datum.Substring(6, 4)); 
     int month = System.Convert.ToInt32(Datum.Substring(3, 2)); 
     int day = System.Convert.ToInt32(Datum.Substring(0, 2)); 
     int hour = System.Convert.ToInt32(Datum.Substring(11, 2)); 
     int minute = System.Convert.ToInt32(Datum.Substring(14, 2)); 
     int second = System.Convert.ToInt32(Datum.Substring(17, 2)); 
     DateTime Time = new DateTime(year, month, day, hour, minute, second); 
     if (Time < System.DateTime.Now) 
     { 
      return Brushes.Red as Brush; 
     } 
     else 
     { 
      return Brushes.Black as Brush; 
     } 

    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 

    #endregion 
} 

Je ne sais pas ce qui est faux, mais le convertisseur est même pas CALED (le premier convertisseur fonctionne parfaitement). La fenêtre de sortie montre ceci:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Prüfdatum; DataItem=null; target element is
'DataGridTextColumn' (HashCode=16187528); target property is 'Foreground' (type 'Brush')

J'espère que vous pouvez me aider, les gars

Thx

Répondre

0

Puisque vous avez binded à DataGrid donc pas besoin de « liaison » dans DataGridTextColumn et ConverterParameter pas non plus nécessaire parce que votre convertisseur n'utilise pas le paramètre. Essayez ci-dessous

<toolkit:DataGridTextColumn Header="Prüfdatum" Foreground="{Binding Path=Prüfdatum, Converter={StaticResource TimestampToColorConverter}}" /> 
+0

Mais je veux aussi le « Prüfdatum » comme contenu (avec le paramètre Je suis d'accord, tis était seulement un test) – Tokk

+0

Pouvez-vous définir un point d'arrêt dans le convertisseur et voir si vous obtenez la valeur? – Ragunathan

+0

C'est la façon dont j'ai découvert que le convertisseur n'est pas appelé à l'exécution – Tokk

1

DataGridTextColumn dit le DataGrid pour créer un TextBlock pour chaque ligne de cette colonne. DataGridTextColumn.Binding puis configure une liaison pour TextBlock.Text, qui est déclenché chaque fois qu'une nouvelle ligne et un nouveau TextBlock pour cette ligne sont créés.

Je ne sais pas si la liaison est exécuté jamais, mais au plus une fois (et non pour chaque ligne):

Reliure = "{Binding Path = Prüfdatum, Converter = {}} StaticResource TimestampToDateConverter"

La solution correcte consiste à créer un style pour ce bloc de texte et à définir une liaison pour ForeGround. Cela sera exécuté pour chaque TextBlock généré. Le défi ici est que le TextBlock trouve les données. Cela peut être réalisé avec une liaison relative à DataGridRow, un ancêtre dans l'arbre visuel. DataGridRow.Item donne accès aux données derrière la grille:

<Window.Resources> 
    <Style x:Key="ForegroundStyle" TargetType="TextBlock"> 
    <Setter Property="Foreground" 
     Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, 
     Path=Item.Prüfdatum, 
     Converter={StaticResource TimestampToColorConverter}/> 
    </Style> 
</Window.Resources> 

<DataGrid> 
    <DataGrid.Columns> 
    <DataGridTextColumn Binding="{Binding SomeData}" ElementStyle="{StaticResource ForegroundStyle}"/> 
</DataGrid.Columns> 

droit Compliqué? Je vous recommande de lire mon article détaillées sur DataGrid mise en forme à: http://www.codeproject.com/Articles/683429/Guide-to-WPF-DataGrid-formatting-using-bindings?msg=5037235#xx5037235xx

Bonne chance, vous en avez besoin :-)