2015-12-18 1 views
1

J'ai un problème avec le passage de l'objet au convertisseur dans WPF.WPF: passage de l'objet datagridrow au convertisseur

Mon DataGrid ressemble:

<DataGrid x:Name="customTasksDataGrid" Margin="10,10,10,38" Grid.Column="1" IsReadOnly="True" AutoGenerateColumns="False"> 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow"> 
      <Setter Property="ToolTip"> 
       <Setter.Value> 
        <TextBlock Text="{Binding Path=., Converter={StaticResource converter}, NotifyOnTargetUpdated=True}"/> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DataGrid.RowStyle> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="ID" Binding="{Binding ID}"/> 
     <DataGridTextColumn Header="Klient" Binding="{Binding Client.Names}"/> 
     ... 
    </DataGrid.Columns> 
</DataGrid> 

Converter:

public class DateToBrushConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     CustomTask t = (CustomTask)value; 
     Console.WriteLine(t.ToString()); // HERE 
     ... 
    } 

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

Lors de l'exécution de mon prog ligne marquée jette l'erreur, que mon objet CustomTask t est nulle. Qu'est-ce que je fais mal?

EDIT:

Comme Vadim Martynov a suggéré que je change mon convertisseur:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (value == null) 
     return null; 
    CustomTask t = (CustomTask)value; 
    ... 
} 

Et il fonctionne parfaitement maintenant! Merci

+0

Qu'advient-il si vous prenez l'appel au convertisseur , c'est-à-dire remplacer par: le nom du client apparaît-il dans l'info-bulle? – Stew52

+0

@ Stew52 non dans ce cas, le convertisseur n'appelle jamais –

+0

il ne le fera pas parce que vous l'avez supprimé. mais cela montre-t-il ce que vous attendez? c'est-à-dire que le contexte de données de l'info-bulle est ce que vous attendez d'elle? – Stew52

Répondre

3

Code suivant fonctionne bien pour moi:

<DataGrid.RowStyle> 
    <Style TargetType="DataGridRow"> 
     <Setter Property="ToolTipService.ToolTip" Value="{Binding Path=., Converter={StaticResource converter}}" /> 
    </Style> 
</DataGrid.RowStyle> 

J'ai aussi remarqué qu'il n'y a qu'un seul appel avec une valeur nulle dans votre code. Les appels suivants (si votre liaison n'échoue pas) n'auront pas une valeur CustomTask nulle (lorsque vous appelez Tooltip) et seront bons. Ensuite, ajoutez simplement if (t == null) return null; à votre convertisseur et tout ira bien.

public class DateToBrushConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    CustomTask t = (CustomTask)value; 
    if(t == null) 
     return null; // or other default value 
    ... 
} 

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

Je pense que ce la raison de ce comportement est que DataGrid rend l'ensemble de ses modèles à la page et rendre appel infobulle sans données et source de données. Si vous définissez la propriété via mon premier exemple de code, il n'y a rien à rendre et à convertir les appels uniquement après la liaison des données.

MISE À JOUR Pour manipuler la colonne isolée en cas similaire, vous pouvez modifier le style ou le modèle de cette colonne au lieu de RowStyle comme int l'exemple ci-dessous:

<DataGrid x:Name="customTasksDataGrid" ItemsSource="..." IsReadOnly="True" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="ID" Binding="{Binding ID}"/> 
     <DataGridTextColumn Header="Klient" Binding="{Binding Name}"> 
      <DataGridTextColumn.ElementStyle> 
       <Style TargetType="{x:Type TextBlock}"> 
        <Setter Property="ToolTipService.ToolTip"> 
         <Setter.Value> 
          <TextBlock Text="{Binding Path=., Converter={StaticResource converter}}"/> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </DataGridTextColumn.ElementStyle> 
     </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 
+0

Merci mec, ce code fonctionne pour moi, mais j'ai eu un problème avec l'étape suivante. Changer la couleur d'arrière-plan de la ligne entière fonctionne parfaitement, mais comment changer le fond d'une seule cellule dans ma grille de données en utilisant ces fonctions? Bien sûr, j'ai changé 'ToolTipService.ToolTip' à' Background' –

+0

@MarcinZdunek est [cette question] (http://stackoverflow.com/questions/5549617/change-datagrid-cell-colour-based-on-values) vous aide ? Changez simplement DataGridTextColumn.ElementStyle au lieu du style de ligne. –

+0

mais j'ai besoin de changer la couleur de la cellule ayant des informations de l'objet entier stocké dans une rangée. Par exemple, la couleur de la cellule est basée sur les paramètres de 2 objets –