我需要让我的DataGrid中的单元格反映有条件的规则......我已经得到了很多,并且已经花费了太多时间在此我希望有人可以帮助我?所以,这是我的网格目前的样子时运行:WPF DataGrid - 在单个单元格上条件格式化的触发器
在这里你可以看到(忽略成果 & 标准列),有三组两列同在这里关注。我目前将条件规则应用于XPercVerified列,但最终我希望EF [X]列显示基于相应PercVerified列中的值的背景更改。还有一点需要说明的是,可以有任意数量的这些双列组合......
但是我现在的问题是我似乎只能应用规则来有条件地格式化整个行。在上面的屏幕截图中,您可以看到1PercVerified列在第一行有1个。这会使整行变为绿色。代码如下:
Private Sub dgUnitMatrix_AutoGeneratingColumn(sender As Object, e As DataGridAutoGeneratingColumnEventArgs) Handles dgUnitMatrix.AutoGeneratingColumn
If (e.Column.Header.ToString().Contains("PercVerified")) Then
e.Column.CellStyle = TryCast(Application.Current.FindResource("PercVerified"), Style)
End If
End Sub
在这里,我们调用AutoGeneratingColumn事件,当我们有一个列,它是像PercVerified,调用应用资源风格:
<Application x:Class="Application"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
ShutdownMode="OnMainWindowClose">
<Application.Resources>
<Style x:Key="PercVerified" TargetType="{x:Type DataGridCell}" >
<Style.Triggers>
<DataTrigger Binding="{Binding 1PercVerified}" Value="0">
<Setter Property="Background" Value="DarkRed"></Setter>
<Setter Property="Foreground" Value="White"></Setter>
<Setter Property="Margin" Value="-2.0"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding 1PercVerified}" Value="1">
<Setter Property="Background" Value="DarkGreen"></Setter>
<Setter Property="Foreground" Value="White"></Setter>
<Setter Property="Margin" Value="-2.0"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Application.Resources>
</Application>
其中存在Application.XAML文件。 我似乎有另一个问题是,即使我可以得到上面的工作只是单元格(而不是行) - 我似乎只能在我的条件下确定(即限制值必须等于 - 我不能做整数大于或小于?)......这是真的吗?
我已经开始寻找更远的地方,因为我感觉这种造型不适合我想要的工作......所以,IValueConverters已经出现了几次,但我似乎不能够得到这个工作。是否值得我花时间研究这些只是为了发现它是另一个死胡同?
我可以提供任何额外的信息,任何人都可能需要...我渴望得到这个排序,因为我已经浪费了太多的时间在WPF中的东西,只是在WinForms中很容易!
编辑
继从J.H.的出色答卷我已将它作为对象值传递给DataRowView(而不是示例Class Object),以适应它。
在转换器中,我们正在创建变量dc。这样做的条件格式比较时,而不是
' Get the cells DataContext as our data class '
Dim dc As DataRowView
dc = TryCast(cell.DataContext, DataRowView)
If IsNothing(dc) Then Exit Function
' Get the column number of the columnName that matches the Path
Dim ColNo As Integer
Dim idx As Integer = 0
For Each column As DataColumn In dc.DataView.Table.Columns
If column.ColumnName = path Then
ColNo = idx
End If
idx = idx + 1
Next
然后:代码,整个区块已被更改为
Dim pv = dc.GetType().GetProperty(path).GetValue(dc)
我们使用
Dim pv As String = dc.Row.Item(ColNo).ToString()
除了少数其他由于差异的变化,这是一种享受!
感谢这一切,它完全让我朝着我所寻找的方向前进。我想我现在已经解决了这个问题。我做了一些工作来做这件事,虽然因为传递给你的转换器的'值'是MyData对象的实例(使用你使用的属性)..对于我,我得到了(我认为??)一个具有列和行的DataRow ..所以我需要在那里做点什么。我会更新! – CJH
纠正 - 我的DataContext的值实际上是一个DataRowView。我希望我能做到这一点,复制获得PV价值。 – CJH
管理得到这个自定义,使用DataRowView作为值而不是MyData对象传递。我将在原始问题的编辑中发布我的更改。非常感谢agani J.H. – CJH