我有一個標準的(WPF工具包)數據網格。一些列(明確定義的)必須以百分比顯示。如果值低於0,則某些列必須以紅色顯示(兩組列不相同)。我試圖分別使用StringFormat
和Style
來實現這些要求。我的XAML:WPF 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();
}
}
}
我覺得這一切都非常標準,但問題是,它通過StringFormat
走後轉換得到Text
價值,並在此指出很難正確解析它(因爲實際上,並非所有列都具有相同的格式)。如果我拿出StringFormats
,轉換器工作正常,文字顯示爲紅色。我錯過了明顯的東西嗎?有沒有簡單的方法來解決這個問題?我現在唯一能想到的就是將格式轉換爲不同的轉換器,我不相信這會起作用。
這看起來好像會起作用,但我沒有足夠的時間來測試它。不管怎麼說,還是要謝謝你! – vlad
這是一個更好的重用解決方案,並且像魅力一樣工作!這應該是真正的答案 – DLeh