最近我刚开始学习WPF。虽然我的大部分开发经验来自Win Forms,但我已经成功地顺利过渡到WPF。
OVERVIEW
我正在编写一个程序,用于比较两个单独的dataTable中的信息,并反映在dataGrid中所做的更改。
dataTables表示旧信息列表"和"新信息"。在比较dataTables之后,我希望根据是否在"新信息表中进行了更改来突出显示特定单元格。
一个例子是,如果dataGrid([0] [0])中的第一个单元格包含' 3'来自"旧信息" dataTable和"新信息"中的相同单元格([0] [0]) dataTable包含' 5'。我希望将背景颜色改为黄色,以反映这种变化。
PROBLEM
我目前正在处理两个正在填充的dataGrid对象,并且表示两个dataTables("旧信息"和#34;新信息")。我遇到的问题是,我似乎无法很好地访问特定的行或列。我希望能够访问特定的行/单元格,以便通过代码更改背景颜色。
Comments
我记得当我使用Win Forms时,您可以按照dataGrid1.Rows [rowNumber] .Columns [ColumnNumber]的方式执行某些操作来访问特定的行/列。
从我到目前为止所读到的关于WPF dataGrids的内容来看,它们更基于对象或类似的东西,使得访问特定行/列的过程有点不同/繁琐。如果你碰巧知道如何访问WPF中dataGrid中的行/单元格内容,请告诉我。任何简单的例子将不胜感激。
答案 0 :(得分:2)
DataGrids非常适合数据绑定,这是正确的,并且很难以编程方式访问和操作其中的行,列和单元格。使用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中的代码隐藏习惯,那么值得深入了解。