数据网格:背景颜色+根据单元格值使用触发器禁用选择
本文关键字:单元格 触发器 选择 网格 数据网 背景 颜色 数据 | 更新日期: 2023-09-27 18:14:08
在SO上有很多关于WPF数据网格的问题,但我仍然要问我的问题,因为我只是无法从这些问题中得到我想要的……所以不要生我的气,试着通过回答"非常请"来帮助我。
提示:主要问题是:为什么我的触发器不工作?
: |是否有一个数据网格属性禁用选择没有值的单元格?我想我知道有这样的东西,但我现在找不到。如果没有这样的事情,你怎么解决这个问题?我在想selectedCellsChanged之类的事件。但我不知道该怎么解决。
我如何设置背景属性的单元格取决于里面的值?正在寻找一些文本/内容/值属性为DatagridCell(http://msdn.microsoft.com/en-us/library/system.windows.controls.datagridcell.aspx),但没有为我工作…我知道有一些价值转换器,但我正在考虑使用触发器解决这个问题。
Some info: I have set SelectionMode="Extended"
+ SelectionUnit="Cell"
.
我试过设置背景使用触发器,但它没有工作:
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Style.Triggers>
<Trigger Property="HasContent" Value="False">
<Setter Property="Background" Value="DarkGray"/>
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
属性IsSelected
工作正常,但没有内容的东西不。是我的想法(错误),"或null
是没有内容?也尝试了<Trigger Property="Content" Value="">
和<Trigger Property="Content" Value="null">
,但这些东西只是不想为我工作。我怎么了??
编辑:我发现这个Q/A -我如何使用WPF Toolkit Datagrid更改单元格的背景颜色,所以我想我会用第二个Q工作,但我仍然看不到我的触发器有什么问题……此外,如果我的触发器工作,我可以以某种方式将HasContent="False"
设置为不可选的单元格,如果有类似的东西。但我只需要让我的触发器工作:D
Edit2:当我设置<Trigger Property="HasContent" Value="True">
时,它适用于我所有的单元格。所以我猜它需要null/"作为值。这让我有一个问题:
如果我想为null设置特殊背景并禁用它们的选择,我该如何解决这个问题?
Edit3:禁用选择应该这样工作:<Setter Property="Focusable" Value="false"/>
感谢WPF ListView关闭选择。D:'(
现在我只需要计算出关于单元格null
内容的触发器…有提示吗?
我创建了一个简单的DataGrid
,并试图找出为什么HasContent
总是返回true
。我检查Content
属性,它有TextBlock
在它。也许这就是为什么它总是正确的原因。
要处理这个问题,你可以修改你的Trigger
使用转换器:
<DataTrigger Binding="{Binding DataContext, RelativeSource={RelativeSource Self}, Converter={StaticResource CellConverter}}" Value="False" >
<Setter Property="Background" Value="Green"/>
</DataTrigger>
和在转换器检查适当的属性,如果是空的。要知道应该检查哪个属性转换器,可以使用ConverterParameter
。
这不是一个优雅的解决方案…但是它可以工作;)
这就是我如何设法最终解决选择空单元格的问题。我知道这不是最好的解决方案,但它对我有用感谢这个问/答:如何确定选定的单元格值在数据网格?(WPF)它帮助了:).
private void mydatagrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
foreach (var item in e.AddedCells)
{
var col = item.Column as DataGridColumn;
var fc = col.GetCellContent(item.Item);
if (fc is TextBlock)
{
if (((fc as TextBlock).Text == (""))||((fc as TextBlock).Text == null))
{
mydatagrid.SelectedCells.Remove(item);
fc.Focusable = false; // not sure if neccesarry/working after the previous line
}
}
}
}
关于背景颜色的部分在这里解决:如何在AutoGeneratingColumn事件期间根据其值设置数据网格单元格的背景?
如果你对我的解决方案有任何抱怨或改进,请添加评论:)。