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

时间:2013-05-17 08:14:19

标签: c# wpf datagrid background triggers

关于SO的WPF数据网格有很多问题,但是我仍然要问我的原因我无法得到我想要的东西...所以不要生我的气并尝试帮助我通过回答相当愉快:]。

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

  1. 是否有一个datagrid属性禁止选择没有值的单元?我想我知道有类似的东西,但我现在找不到它。如果没有这样的东西你怎么解决这个问题?我正在考虑关于selectedCellsChanged的事件或类似的事情。但我不确定如何解决这个问题。

  2. 如何根据内部值设置单元格的背景属性?正在为DatagridCell(http://msdn.microsoft.com/en-us/library/system.windows.controls.datagridcell.aspx)寻找一些text / content / value属性,但没有任何效果我... 我知道有一些价值转换器,但我正在考虑使用触发器解决这个问题。

  3. 一些信息:我已设置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 - How do I change the background color of a cell using WPF Toolkit Datagrid所以我想我会用第二个Q工作,但我仍然没有看到我的触发器有什么问题。 。 此外,如果我的触发器工作,我可以以某种方式设置具有HasContent="False"的单元格,如果有类似的东西则不可选择。但我只需要让我的扳机工作:D

    Edit2:当我设置<Trigger Property="HasContent" Value="True">时,它适用于我的所有单元格..所以我猜它需要null /“”作为值。这让我有疑问:

    如果我想要空值的特殊背景并禁用它们的选择,我该如何解决?

    编辑3:禁用所选内容应如下所示:<Setter Property="Focusable" Value="false"/>感谢WPF ListView turn off selection ..这不起作用:D:'(

    现在我只需要解决关于null单元格内容的触发器...任何提示?

2 个答案:

答案 0 :(得分:1)

我创建了一个简单的DataGrid并尝试找出HasContent始终返回true的原因。我检查Content属性,其中包含TextBlock。所以这可能就是为什么它总是如此。

要解决此问题,您可以修改Trigger以使用转换器:

<DataTrigger Binding="{Binding DataContext, RelativeSource={RelativeSource Self}, Converter={StaticResource CellConverter}}"  Value="False" >
     <Setter Property="Background" Value="Green"/>
</DataTrigger>

在转换器中检查适当的属性if是否为null。要了解应检查哪个属性转换器,您可以使用ConverterParameter

这不是一个优雅的解决方案......但它有效;)

答案 1 :(得分:0)

这就是我通过选择空单元格最终解决问题的方法。 我知道这不是最好的解决方案,但它对我有用:D 感谢此问答:How Can Determine Selected Cell's Value In DataGrid? (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
                    }
                }
            }
        }

有关背景颜色的部分在此解决:How to set background of a datagrid cell during AutoGeneratingColumn event depending on its value?

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