【问题标题】:Accessing a particular row/column in a dataGrid in WPF访问 WPF 中 dataGrid 中的特定行/列
【发布时间】:2014-10-28 02:39:56
【问题描述】:

最近刚开始学习WPF。尽管我的大部分开发经验都来自 Win Forms,但我已经相当顺利地过渡到 WPF。

                                OVERVIEW

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

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

例如,如果 dataGrid ([0][0]) 中的第一个单元格包含“旧信息”数据表中的“3”,并且如果“新信息”数据表中的相同单元格 ([0][0])信息”数据表包含'5'。我希望将背景颜色更改为黄色,以反映这种变化。

                                 PROBLEM

我目前正在处理两个正在填充的 dataGrid 对象,它们代表两个数据表(“旧信息”和“新信息”)。我遇到的问题是我似乎无法很好地访问特定的行或列。我希望能够访问特定的行/单元格,以便可以通过代码更改背景颜色。

                                 Comments

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

从我目前所读到的关于 WPF 数据网格的内容来看,它们更多地基于对象或类似的东西,使得访问特定行/列的过程有点不同/乏味。如果您碰巧知道如何访问 WPF 中 dataGrid 中的行/单元格内容,请告诉我。任何简单的例子都将不胜感激。

【问题讨论】:

    标签: c# wpf excel datagrid datatable


    【解决方案1】:

    您说得对,DataGrid 非常适合数据绑定,并且很难以编程方式访问和操作其中的行、列和单元格。使用 WPF 时,沿着 MVVM 路线走是首选方法。在您的情况下,您可以使用基础数据来驱动单元格颜色,而不是尝试编写代码隐藏代码来实现这一点。

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

    如果不知道您的特定网格正在显示什么,就很难提供示例。但是,假设您要列出客户详细信息 - 第一列可能是名称,下一列可能是他们的地址,依此类推。一种解决方案可能是在模型类上包含额外的布尔属性,以指示特定属性值是否与其“旧”对应物不同。数据触发器可以利用这些属性来更改单元格背景颜色,数据触发器位于应用于数据网格列的 CellStyles 中。

    快速而肮脏的代码示例在我脑海中浮现,因此可能不是 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 的代码隐藏习惯,那么了解它是非常值得的!

    【讨论】:

    • 感谢您的洞察!我会玩几个小时,看看我有没有运气。
    猜你喜欢
    • 2013-12-13
    • 2011-08-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2011-07-28
    • 2018-04-06
    • 1970-01-01
    • 2016-02-21
    相关资源
    最近更新 更多