【发布时间】:2013-05-14 18:50:17
【问题描述】:
我仍在与单元格背景的操纵作斗争,所以我提出了一个新问题。
用户“H.B.”写道我实际上可以在AutoGeneratingColumn 事件期间设置单元格样式 - Change DataGrid cell colour based on values。问题是我不知道该怎么做。
我想要什么:
根据每个单元格的值设置不同的背景颜色。如果值为null,我还希望它不是可点击(我猜是可聚焦的)。
我拥有/正在尝试做的事情:
private void mydatagrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
foreach (Cell cell in e.Column)
{
if (cell.Value < 1)
{
cell.Background = Color.Black;
cell.isFocusable = false;
}
else
{
cell.Background = Color.Pink;
}
}
}
这只是伪代码。在列自动生成期间是否有可能发生这样的事情?如果是这样,我该如何编辑我的代码以使其有效?
我阅读了有关值转换器的信息,但我想知道它是否可以通过编程方式实现,而无需编写 XAML。
请理解我还是 C#/WPF/DataGrid 的初学者。
解决方案第 1 部分:
我使用了我接受的答案。把它放进去
<Window.Resources>
<local:ValueColorConverter x:Key="colorConverter"/>
<Style x:Key="DataGridCellStyle1" TargetType="{x:Type DataGridCell}">
<Setter Property="Padding" Value="5"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">
<Border.Background>
<MultiBinding Converter="{StaticResource colorConverter}">
<Binding RelativeSource="{RelativeSource AncestorType=DataGridCell}" Path="Content.Text"/>
<Binding RelativeSource="{RelativeSource AncestorType=DataGridCell}" Path="IsSelected"/>
</MultiBinding>
</Border.Background>
<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
并为其制作了一个MultiBinding 转换器,因此我还可以为选定的单元格设置背景颜色。
问题:
现在我只需要解决设置空单元格焦点的问题。有什么提示吗?
<Style.Triggers>
<Trigger Property="HasContent" Value="False">
<Setter Property="Focusable" Value="False"/>
</Trigger>
</Style.Triggers>
这不起作用。我在空单元格中有空字符串,但它们充满了'null',所以它应该可以工作,对吧?或者我做错了什么:| ?
解决方案第 2 部分:
所以只要单元格值是“TextBox”,上面的代码就无法工作,所以我决定找到另一种处理方法,可以在我的答案中找到:https://stackoverflow.com/a/16673602/2296407
感谢您尝试帮助我:)
【问题讨论】:
-
你可以在grid的rowdatabound事件中试试这个。 stackoverflow.com/questions/3146456/…
-
自动生成的单元格当然有“内容” - 它是
(这就是我在回答中使用 Content.Text 的原因):) 尝试使用 -
@morincer 感谢您的帮助。我设法以其他方式处理空单元格,因为 DataTrigger 不想和我一起工作,我已经很生气了:D。但真的很感谢您的支持。
-
@goodfriend,没问题。为您的答案添加了一些代码风格的注释
-
这更像是假代码 = 伪代码 :) (虽然我确实有同样的问题,但我正在寻找代码隐藏中的解决方案
标签: c# wpf datagrid background autogeneratecolumn