我有 DataGrid 控件,
ItemSource
绑定到 DataTable。 DataTable 数据是通过 SQL 查询从 Oracle 数据库检索的。
列名和计数不固定,所以我设置了
AutoGenerateColumns="True"
.
如果单元格的前景色为“✔”,我想将其设置为绿色。
我尝试通过单元格内容将单元格值传递给值转换器类。但内容始终为空。
这些是 XAML 代码:
<Style TargetType="DataGridCell"
BasedOn="{StaticResource ExcelCellStyle}"
x:Key="ModifiedExcelCellStyle">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Content.Text, Converter={StaticResource cellConverter}}"
Value="True">
<Setter Property="Foreground" Value="Green"/>
<Setter Property="FontWeight" Value="Bold"/>
</DataTrigger>
</Style.Triggers>
</Style>
<DataGrid Grid.Column="1"
Grid.Row="3"
Margin="0,0,5,5"
ItemsSource="{Binding DtSub, Mode=TwoWay}"
Style="{DynamicResource ExcelStyle}"
RowStyle="{DynamicResource ExcelRowStyle}"
CellStyle="{DynamicResource ModifiedExcelCellStyle}"
ColumnHeaderStyle="{StaticResource DataGridColumnHeaderStyleVertical}"
AutoGenerateColumns="True">
</DataGrid>
这是转换器类:
public class CellValueToBoolenConverter : IValueConverter
{
object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string cellValue = (string)value;
if(cellValue.Equals('✔'))
return true;
return false;
}
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
这是视图模型:
private DataTable dtSub;
public DataTable DtSub
{
get { return dtSub; }
set
{
dtSub = value;
OnPropertyChanged();
}
}
private void GetDatas()
{
DtSub = sqlHelper.GetOperationsData();
}
恐怕您需要为绑定到保存该值的实际列的每一列定义一个
CellStyle
。
您可以通过处理
AutoGeneratingColumn
的 DataGrid
事件来动态执行此操作:
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
Style style = new Style()
{
TargetType = typeof(DataGridCell),
BasedOn = TryFindResource("ExcelCellStyle") as Style
};
DataTrigger trigger = new DataTrigger()
{
Binding = new Binding(e.PropertyName) { Converter = TryFindResource("cellConverter") as IValueConverter },
Value = true
};
trigger.Setters.Add(new Setter(ForegroundProperty, Brushes.Green));
style.Triggers.Add(trigger);
e.Column.CellStyle = style;
}
但是您不能对所有列使用通用
Style
。
您还应该修复您的转换器实现:
object IValueConverter.Convert (object value, Type targetType, object parameter, CultureInfo culture) =>
value is string s && s.Equals("✔");