WPF Datagrid - 根据对象的DataTable自动生成列并设置背景颜色

时间:2017-11-26 15:50:51

标签: wpf datagrid

作为我的数据处理的一部分,我生成以下类的DataTable(列数和行数变化)

public class DataGridCell
{
    public string Text { get; set; }
    public string Background { get; set; }
}

我的计划是将DataGrid绑定到此DataTable;每个单元格应显示DataGridCell.Text值,该单元格的背景颜色应为DataGridCell.Background值。

我已经厌倦了以下

C#

DataTable dtVolume = new DataTable();
    for (int i = 0; i < ColumnNames.Length; i++)
    {
        dtVolume.Columns.Add(ColumnNames[i]);
    }
    for (double p = max; p > min; p -= 0.05)
    {
        var row = dtVolume.NewRow();
        for (int i = 0; i < ColumnNames.Length; i++)
        {
            row[i] = new DataGridCell
            {
                Text = i,
                Background = i % 2 == 0 ? "LightGray" : "Red"
            };
        }
        dtVolume.Rows.Add(row);
    }

dgVolumes.DataContext = dtVolume.DefaultView;

XAML

<DataGrid  x:Name="dgVolumes" ItemsSource="{Binding}">
<DataGrid.CellStyle>
    <Style TargetType="DataGridCell">
        <Setter Property="Background" Value="LightGray"/>
    </Style>
</DataGrid.CellStyle>

这为我提供了一个DataGrid,其单元格背景设置为LightGray,但显示的文本是Namespace.DataGridCell

由于上下文是DataRowView

,因此{Binding Path = Background}失败,因此下面的XAML出错

XAML

<DataGrid  x:Name="dgVolumes" ItemsSource="{Binding}">
<DataGrid.CellStyle>
    <Style TargetType="DataGridCell">
        <Setter Property="Background" Value="{Binding Path=Background}"/>
    </Style>
</DataGrid.CellStyle>

我该怎么做?

此处WPF Binding to a DataGrid from a DataTable of Objects提供的解决方案和Change DataGrid cell colour based on values处的另一个解决方案不会自动生成列。他们使用DataGridTemplateColumn,但在我的情况下,列需要自动生成,因为列(和行)的数量会发生变化。

2 个答案:

答案 0 :(得分:0)

什么是dtVolume.DefaultView

使用标准绑定可以正常工作,因此我想知道您尝试将DataGrid绑定到哪种对象。

以下是我使用的代码,请告诉我您的不同之处。

ViewModel和cs代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        DataContext = new MyViewModel();
    }
}

public class MyViewModel
{
    public MyViewModel()
    {
        Items = new List<DataGridCell>();
        for (int i = 0; i < 10; i++)
        {
            int c = i % 8;
            Items.Add(new DataGridCell
            {
                Text = $"Item #{i}",
                Background = $"#{c}{c}{c}{c}{c}{c}"
            });
        }
    }

    public List<DataGridCell> Items { get; set; }
}

public class DataGridCell
{
    public string Text { get; set; }
    public string Background { get; set; }
}

XAML代码:

<Grid>
    <DataGrid  x:Name="dgVolumes" ItemsSource="{Binding Items}">
        <DataGrid.CellStyle>
            <Style TargetType="DataGridCell">
                <Setter Property="Background" Value="{Binding Background}"/>
            </Style>
        </DataGrid.CellStyle>
    </DataGrid>
</Grid>

答案 1 :(得分:0)

您无法将DataGridCell对象真正存储在DataRow中。有关详细信息,请参阅我的答案:

Binding an object to data grid cell - conditional cell style

将对象模型与此类DataTable混合使用并不是一个好主意。使用简单的标量列值绑定 IEnumerable<DataGridCell> DataTable