WPF Datagrid:更改数据网格单元前景色

问题描述 投票:0回答:1

我有 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();
}

wpf xaml datagrid converters
1个回答
0
投票

恐怕您需要为绑定到保存该值的实际列的每一列定义一个

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("✔");
© www.soinside.com 2019 - 2024. All rights reserved.