WPF从一个对象DataTable绑定到DataGrid

4

我是一名新手,对于数据绑定还有很多不了解的地方。我已经花费数小时阅读和研究这个问题,希望有人能够至少指点我正确的方向。

我的问题是,我有一个DataTable,其中填充了对象,例如:

public class SimpleObject
{

    public string DisplayValue { get; set; }
    public bool Match { get; set; }
    public string BackGroundColor
    {
        get { if (Match) return "Green"; else return "White"; }
        set { //do nothing }
    }

}

我已经设置了数据表格列的标题如下:

DataTable MyDataTable = new DataTable()
List headers = new List<string>() {"Header1", "Header2", "Header3", "Header4"}
foreach (string key in headers)
{         
    MyDataTable.Columns.Add(new DataColumn(key, typeof(SimpleObject)));
}

我使用类似以下方式添加行来填充我的 DataTable 行:

SimpleObject[] rowList = new SimpleObject[4]
DataRow dataRow = MyDataTable.NewRow();
for(int i = 0; i < 4; i++)
{
    //Not really how I determine values, but this will do for a basic example
    rowList[i].DisplayValue = i.ToString();
    rowList[i].Match = i % 2 == 0;
}
dataRow.ItemArray = rowList;
MyDataTable.Rows.Add(dataRow);

SimpleDataGrid.DataContext = MyDataTable;

现在,我想做的是将MyDataTable绑定到DataGrid,以便:
  • 在单元格的值中显示SimpleObject.DisplayValue
  • 单元格的背景颜色由SimpleObject.BackGroundColor确定
如果有人能给我建议如何做到这一点,我会非常感激!到目前为止,我已经尝试了类似于以下内容的操作:
 <DataGrid Name="SimpleDataGrid" 
                      AutoGenerateColumns="False"
                      ItemsSource="{Binding}">
                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="Header1" Width="100">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Header1.DisplayValue}"
                                           BackGround="{Binding Path=Header1.BackGroundColor}"
                                   />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>

 </DataGrid>

但是没有成功。我甚至无法将DisplayValue绑定到Text(即使不尝试绑定BackGroundColor)。任何帮助或指导将不胜感激!


set 方法用于设置背景颜色,它是一个无限循环,但很可能不是你目前面临的问题。 - user7116
没错,我快速创建了那个对象以简化我的真实对象。不过已经修复了。 - mario87
我目前无法进行测试,但是我想知道如果你的 BackgroundColor 属性是 Brush 类型并返回 Brushes.GreenBrushes.White,是否可以正常工作。 - vlad
好的,目前为止,我甚至无法绑定文本。我想我应该在问题中澄清这一点。 - mario87
基本上和你现在拥有的一样,只是语法固定了。但我可以展示代码。 - Peter Hansen
显示剩余4条评论
1个回答

1

我尝试复制您的问题,但对我来说似乎工作正常。

我已向 DataGrid 添加了2列,并向 DataTable 添加了1个项目,因此将创建1行。

TextBlocksTextBackground 属性都正确绑定。

这是我使用的源代码。看看它是否适用于您。

XAML:

<DataGrid Name="SimpleDataGrid" 
                  AutoGenerateColumns="False"
                  ItemsSource="{Binding}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Header1" Width="100">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Header1.DisplayValue}"
                               Background="{Binding Path=Header1.BackGroundColor}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Header2" Width="100">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Header2.DisplayValue}"
                               Background="{Binding Path=Header2.BackGroundColor}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

代码后台:

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

        DataTable MyDataTable = new DataTable();
        List<string> headers = new List<string>() { "Header1", "Header2", "Header3", "Header4" };

        foreach (string key in headers)
        {         
            MyDataTable.Columns.Add(new DataColumn(key, typeof(SimpleObject)));
        }

        SimpleObject[] rowList = new SimpleObject[4];
        DataRow dataRow = MyDataTable.NewRow();

        for (int i = 0; i < 4; i++)
        {
            //Not really how I determine values, but this will do for a basic example
            rowList[i] = new SimpleObject();
            rowList[i].DisplayValue = i.ToString();
            rowList[i].Match = i % 2 == 0;
        }
        dataRow.ItemArray = rowList;
        MyDataTable.Rows.Add(dataRow);

        SimpleDataGrid.DataContext = MyDataTable;
    }        
}

public class SimpleObject
{
    public string DisplayValue { get; set; }
    public bool Match { get; set; }
    public string BackGroundColor
    {
        get 
        { 
            if (Match) 
                return "Green"; 
            else return "Blue"; 
        }
    }
}

这就是我想要做的,而且这对我也有效。我的项目与这段代码非常相似,但无法运行。不过,只需要找到这个小差异并修复它就可以了,感谢您的帮助! - mario87

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接