У меня есть стандартная (WPF-инструментарий) сетка данных. Некоторые столбцы (которые явно определены) должны отображаться как проценты. Некоторые столбцы должны быть показаны красным цветом, если значения ниже 0. (Два набора столбцов не совпадают). Я попытался реализовать эти требования, используя StringFormat
и Style
, соответственно. Мой XAML:WPat datagrid: конвертер и 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>
И соответствующий преобразователь:
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();
}
}
}
Я думаю, что это все довольно стандартно, но проблема заключается в том, что преобразователь получает значение Text
после того как она прошла через StringFormat
, и при этом что это трудно правильно разобрать (поскольку на самом деле не все столбцы имеют одинаковый формат). Если я выберу StringFormats
, конвертер прекрасно работает, и текст появляется красным. Мне что-то не хватает? Есть ли простой способ обойти это? Единственное, о чем я могу думать сейчас, - это переместить форматирование в другой конвертер, и я не уверен, что это сработает.
похоже, что это сработает, но у меня не было достаточно времени, чтобы проверить это. Спасибо, в любом случае! – vlad
это гораздо лучшее решение для повторного использования и работает как шарм! это должен быть реальный ответ – DLeh