Tengo una cuadrícula de datos estándar (WPF toolkit). Algunas de las columnas (que están explícitamente definidas) deben mostrarse como porcentajes. Algunas columnas deben mostrarse en rojo si los valores están por debajo de 0. (Los dos conjuntos de columnas no son iguales). Traté de implementar estos requisitos usando un StringFormat
y Style
, respectivamente. Mi XAML:WPF datagrid: convertidor y 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>
y el convertidor relevante:
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();
}
}
}
Creo que es todo bastante estándar, pero el problema es que el convertidor obtiene el valor Text
después de que se ha ido a través de la StringFormat
, y en ese es difícil analizarlo correctamente (ya que, en realidad, no todas las columnas tienen el mismo formato). Si saco el StringFormats
, el convertidor funciona bien y el texto aparece en rojo. ¿Me estoy perdiendo algo obvio? ¿Hay una manera fácil de evitar esto? Lo único que se me ocurre en este momento es mover el formato a un convertidor diferente, y no estoy convencido de que funcione.
parece que funcionaría, pero no tuve tiempo suficiente para probarlo. ¡Gracias de cualquier manera! – vlad
esta es una solución mucho mejor para reutilizar, ¡y funciona como un encanto! esta debería ser la verdadera respuesta – DLeh