数据网格:背景颜色+根据单元格值使用触发器禁用选择

本文关键字:单元格 触发器 选择 网格 数据网 背景 颜色 数据 | 更新日期: 2023-09-27 18:14:08

在SO上有很多关于WPF数据网格的问题,但我仍然要问我的问题,因为我只是无法从这些问题中得到我想要的……所以不要生我的气,试着通过回答"非常请"来帮助我。

提示:主要问题是:为什么我的触发器不工作?

: |
  1. 是否有一个数据网格属性禁用选择没有值的单元格?我想我知道有这样的东西,但我现在找不到。如果没有这样的事情,你怎么解决这个问题?我在想selectedCellsChanged之类的事件。但我不知道该怎么解决。

  2. 我如何设置背景属性的单元格取决于里面的值?正在寻找一些文本/内容/值属性为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事件期间根据其值设置数据网格单元格的背景?

如果你对我的解决方案有任何抱怨或改进,请添加评论:)。