標準 (WPF ツールキット) データ グリッドがあります。一部の列 (明示的に定義されている) は、パーセンテージとして表示する必要があります。値が 0 未満の場合、一部の列を赤で表示する必要があります (2 つの列のセットは同じではありません)。StringFormat
とをそれぞれ使用して、これらの要件を実装しようとしStyle
ました。私のXAML:
<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
と、コンバーターは正常に動作し、テキストは赤で表示されます。明らかな何かが欠けていますか?これを回避する簡単な方法はありますか? 今考えられる唯一のことは、フォーマットを別のコンバーターに移動することであり、それがうまくいくとは確信していません。