访问WPF中的dataGrid中的特定行/列

最近我刚开始学习WPF。 虽然我的开发经验大部分来自Win Forms,但我已经相当顺利地转换到了WPF。

OVERVIEW 

我正在编写一个程序,比较两个单独的数据表中的信息,并反映在dataGrid中所做的更改。

dataTables表示“旧信息”和“新信息”的列表。 在比较数据表之后,我希望根据是否在“新信息表”中做出改变来突出显示特定的单元格。

例如,如果dataGrid([0] [0])中的第一个单元格包含“Old Information”dataTable中的“3”,并且“New Information”dataTable中包含相同的单元格([0] [0])包含“5”。 我想改变背景颜色来说,黄色,以反映这种变化。

  PROBLEM 

我目前正在使用两个dataGrid对象,这些对象正在填充,并表示两个dataTable(“旧信息”和“新信息”)。 我遇到的问题是,我似乎无法很好地访问特定的行或列。 我想能够访问一个特定的行/单元格,所以我可以通过代码更改背景颜色。

  Comments 

我记得当我使用Win Forms时,你可以沿着dataGrid1.Rows [rowNumber] .Columns [ColumnNumber]的行来做一些事情来访问特定的行/列。

从我迄今为止读到的有关WPF dataGrids的内容来看,他们更基于对象或类似的东西,使访问特定行/列的过程有点不同/乏味。 如果您碰巧知道如何访问WPF中的dataGrid中的行/单元格内容,请让我知道。 任何简单的例子将不胜感激。

DataGrids非常适合数据绑定,这是正确的,并且很难以编程方式访问和操作其中的行,列和单元格。 在使用WPF时,使用MVVM路线是首选方法。 在你的情况下,你可以使用底层数据驱动单元格颜色,而不是尝试编写代码隐藏代码来实现这一点。

MVVM是一个很大的主题,但作为可能涉及到的东西的味道,通常会创build一个“模型”类,表示您想要出现在网格行中的实体。 您的视图模型将公开这些对象的集合,这些对象绑定到网格并呈现为单独的行(通常您将在XAML中手动定义列,将它们绑定到模型类的单个属性)。

在不知道你的网格显示什么的情况下提供一个例子是很困难的。 但是,假设您列出了客户详细信息 – 第一列可能是名称,下一列是他们的地址,等等。 一种解决scheme可能是在模型类中包含额外的布尔属性,以指示特定属性值是否与其“旧”对应值不同。 数据触发器可以利用这些属性来更改单元格背景颜色,数据触发器驻留在应用于数据网格列的CellStyles中。

快速和肮脏的代码样品closures我的头顶部,所以可能不是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的代码隐藏习惯,那么值得深入了解!