Ho una griglia di dati standard (WPF toolkit). Alcune delle colonne (che sono esplicitamente definite) devono essere mostrate come percentuali. Alcune colonne devono essere visualizzate in rosso se i valori sono inferiori a 0. (I due gruppi di colonne non sono uguali). Ho provato a implementare questi requisiti utilizzando uno StringFormat
e Style
, rispettivamente. La mia XAML:datagrid WPF: convertitore e StringFormat
<Window xmlns:local="clr-namespace:myNamespace"
xmlns:tk="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit">
<Window.Resources>
<local:ValueConverter x:Key="valueToForeground" />
<Style TargetType="{x:Type tk:DataGridCell}">
<Setter Property="Foreground"
Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource valueToForeground}}" />
</Style>
</Window.Resources>
<Grid>
<tk:DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding Path=myClass/myProperty}">
<tk:DataGrid.Columns>
<tk:DataGridTextColumn Header="A"
Binding="{Binding colA}" />
<tk:DataGridTextColumn Header="B"
Binding="{Binding colB, StringFormat=\{0:P\}}" />
<tk:DataGridTextColumn Header="C"
Binding="{Binding colC, StringFormat=\{0:P\}}" />
<tk:DataGridTextColumn Header="D"
Binding="{Binding colD, StringFormat=\{0:P\}}" />
</tk:DataGrid.Columns>
</tk:DataGrid>
</Grid>
</Window>
e il convertitore relativo:
namespace myNamespace
{
public class ValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
SolidColorBrush brush = new SolidColorBrush(Colors.Black);
Double doubleValue = 0.0;
if (value != null)
{
if (Double.TryParse(value.ToString(), out doubleValue))
{
if (doubleValue < 0)
brush = new SolidColorBrush(Colors.Red);
}
}
return brush;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
penso che sia tutto abbastanza standard, ma il problema è che il convertitore ottiene il valore Text
dopo che è passato attraverso la StringFormat
, e in quel punto è difficile da analizzare correttamente (poiché in realtà, non tutte le colonne hanno lo stesso formato). Se tolgo lo StringFormats
, il convertitore funziona correttamente e il testo si presenta in rosso. Mi manca qualcosa di ovvio? C'è un modo semplice per aggirare questo? L'unica cosa che posso pensare adesso è spostare la formattazione in un convertitore diverso, e non sono convinto che funzionerebbe.
sembra che funzioni, ma non ho avuto abbastanza tempo per provarlo. Grazie comunque! – vlad
questa è una soluzione molto migliore per il riutilizzo, e funziona come un fascino! questa dovrebbe essere la vera risposta – DLeh