访问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中的行/单元格内容,请告诉我。任何简单的例子都将不胜感激。

访问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的习惯背后的代码,就非常值得了解!