访问WPF中dataGrid中的特定行/列
本文关键字:WPF dataGrid 访问 | 更新日期: 2023-09-27 18:20:26
最近我刚开始学习WPF。尽管我的大部分开发经验都来自Win Forms,但我还是很顺利地过渡到了WPF。
OVERVIEW
我正在编写一个程序,该程序比较两个独立dataTable中的信息,并反映dataGrid中所做的更改。
dataTables表示"旧信息"answers"新信息"的列表。在比较数据表之后,我希望根据"新信息表"中是否进行了更改来突出显示特定的单元格。
例如,如果dataGrid([0][0])中的第一个单元格包含"旧信息"数据表中的"3",并且"新信息"数据表格中的同一单元格([0][0])包含"5"。我想把背景颜色改成黄色,以反映这种变化。
PROBLEM
我目前正在处理两个dataGrid对象,它们正在被填充,并表示两个dataTable("旧信息"answers"新信息")。我遇到的问题是,我似乎无法很好地访问特定的行或列。我希望能够访问特定的行/单元格,这样我就可以通过代码更改背景颜色。
Comments
我记得当我使用Win Forms时,你可以按照dataGrid1.Rows[rowNumber].Columns[ColumnNumber]的行来访问特定的行/列。
从我目前所读到的关于WPF数据网格的内容来看,它们更基于对象或类似的东西,使得访问特定行/列的过程有点不同/乏味。如果你碰巧知道如何访问WPF中dataGrid中的行/单元格内容,请告诉我。任何简单的例子都将不胜感激。
您是正确的,DataGrids非常适合数据绑定,并且很难以编程方式访问和操作其中的行、列和单元格。使用WPF时,首选的方法是走MVVM路线。在您的情况下,您可以使用底层数据驱动单元格颜色,而不是试图在代码后面编写代码来实现这一点。
MVVM是一个大主题,但作为可能涉及的内容的一种风格,您通常会创建一个"模型"类来表示您希望出现在网格行中的实体。视图模型将公开这些对象的集合,这些对象绑定到网格并呈现为单独的行(通常您会在XAML中手动定义列,将它们绑定到模型类的单独属性)。
在不知道特定网格显示什么的情况下,很难提供一个示例。但假设您正在列出客户详细信息-第一列可能是名称,下一列可能是他们的地址,依此类推。一种解决方案可能是在模型类上包含额外的布尔属性,以指示特定属性值是否与其"旧"对应值不同。数据触发器可以利用这些属性来更改单元格背景颜色,数据触发器位于应用于数据网格列的单元格样式中。
快速和肮脏的代码样本离开了我的头顶,所以可能不是100%正确:
public class Customer
{
public string CustomerName {get; set;}
public string CustomerAddress {get; set;}
public bool CustomerNameDiffers {get; set;}
public bool CustomerAddressDiffers {get; set;}
}
public class MyViewModel
{
public ObservableCollection<Customer> Customers {get; set;}
//etc..
}
XAML:
<Window.Resources>
<Style x:Key="CustomerNameCellStyle"
TargetType="DataGridTextColumn">
<Style.Triggers>
<DataTrigger Binding="{Binding CustomerNameDiffers}"
Value="True">
<Setter Property="Background"
Value="Yellow" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<DataGridTextColumn Binding="{Binding CustomerName}"
CellStyle="{StaticResource CustomerNameCellStyle}"
... />
我意识到这是一个有点笼统的答案,但MVVM是一个大话题,但如果你想充分利用WPF并抛弃Winforms的习惯背后的代码,就非常值得了解!