2015-06-17 22 views
5

Ho un valore datagrid che contiene un valore derivante da uno stored procedure. Tutti i valori sono impostati su Bold come FontWeight.Trigger DataGrid WPF sul contenuto della cella

mi piacerebbe rendere il testo normale quando il contenuto della cella è uguale a 0.

Come posso farlo con un trigger?

lo faccio, ma non sembra lavorando

<DataGrid.CellStyle> 
    <Style TargetType="DataGridCell"> 
      <Setter Property="FontWeight" Value="Bold" /> 
      <Style.Triggers> 
       <Trigger Property="Content" Value="0"> 
        <Setter Property="FontWeight" Value="Normal"/> 
       </Trigger> 
      </Style.Triggers> 
    </Style> 
</DataGrid.CellStyle> 

risposta

7

Non è possibile accedere DataGridCell.Content in questo modo, utilizzare un DataTrigger invece, sulla base di DataGrid.SelectedItem.YourProperty come questo:

<DataGrid.CellStyle> 
     <Style TargetType="DataGridCell"> 
      <Setter Property="FontWeight" Value="Bold" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding YourProperty}" Value="0"> 
        <Setter Property="FontWeight" Value="Normal"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.CellStyle> 

EDIT:

Assumendo che il DataGridColumns sono basati su testo, è possibile utilizzare un IValueConverter come di seguito:

Si noti che se alcune colonne della griglia di dati non sono basate su testo , questa soluzione funziona ancora per quelle colonne che sono.

Xaml:

<Window.Resources> 
    <local:FontWeightConverter x:Key="fontWeightConverter"/> 
</Window.Resources> 

...

<DataGrid.CellStyle> 
     <Style TargetType="{x:Type DataGridCell}"> 
      <Style.Setters> 
       <Setter Property="FontWeight" 
         Value="{Binding RelativeSource={RelativeSource Self}, 
         Path=Content.Text, 
         Converter={StaticResource fontWeightConverter}}" /> 
      </Style.Setters> 
     </Style> 
    </DataGrid.CellStyle> 

Converter:

public class FontWeightConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     if (value != null && value.ToString() == "0") 
      return FontWeights.Normal; 
     return FontWeights.Bold; 
    } 

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

Sembra buono ma ne ho bisogno per tutte le proprietà del mio oggetto. Non voglio replicare 12 volte questo codice che sono sicuro di funzionare – Galma88

+0

Perfetto. La tua modifica funziona. Quindi presumo che non ci sia modo di farlo solo in XAML. È corretto? – Galma88

+1

Sono sicuro al 99% che non ci sia;) –

2

questo è un modo per definire quella colonna:

<DataGridTemplateColumn> 
     <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
          <TextBox Text="{Binding DataBaseValue}"/> 
        </StackPanel> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

È possibile aggiungere un vincolante sulla FontWeightof TextBox con un convertitore associato al Testo se stesso.

+0

Ho 12 colonne. Non voglio replicare questo codice per tutte le colonne. – Galma88

1

Si potrebbe fare questo -

<DataGrid.CellStyle> 
    <Style TargetType="DataGridCell"> 
      <Setter Property="FontWeight" Value="Bold" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=Content.Text, Mode=OneWay, RelativeSource={RelativeSource Self}}" Value="0"> 
        <Setter Property="FontWeight" Value="Normal"/> 
       </Trigger> 
      </Style.Triggers> 
    </Style> 
</DataGrid.CellStyle> 
Problemi correlati