【问题标题】:Datagrid: background colour + disable of selection depending on the cell value - using triggerDatagrid:背景颜色+根据单元格值禁用选择-使用触发器
【发布时间】:2013-05-12 08:23:36
【问题描述】:

关于 SO 上的 WPF 数据网格有很多问题,但我仍然要问我的问题,因为我无法从这些问题中得到我想要的...所以不要生我的气并尝试帮助我请回答漂亮:]。

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

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

  2. 如何根据里面的值设置单元格的背景属性? 正在寻找 DatagridCell(http://msdn.microsoft.com/en-us/library/system.windows.controls.datagridcell.aspx) 的一些文本/内容/值属性,但对我没有任何帮助。 .. 我知道有一些值转换器,但我正在考虑使用触发器来解决这个问题。

一些信息:我设置了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 没有内容吗? 还尝试了&lt;Trigger Property="Content" Value=""&gt;&lt;Trigger Property="Content" Value="null"&gt;,但这些东西就是不想为我工作。我怎么了???

编辑:我找到了这个 Q/A - How do I change the background color of a cell using WPF Toolkit Datagrid 所以我想我会用它来处理第二个 Q,但我仍然看不出我的触发器有什么问题...... 此外,如果我的触发器有效,我可以以某种方式将带有HasContent="False" 的单元格设置为不可选择(如果有类似的东西)。但我只需要让我的触发器工作:D

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

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

Edit3: 禁用选择应该像这样工作:&lt;Setter Property="Focusable" Value="false"/&gt; 感谢WPF ListView turn off selection .. 这不起作用:D :'(

现在我只需要找出关于单元格的null 内容的触发器...有什么提示吗?

【问题讨论】:

  • 这是一个非常简单的代码。它应该工作。在一个简单的项目中尝试一下。我认为您的视图或网格设置有问题。
  • @OlegIgnatov 我更新了 Q.. null 实际上是一些内容有点奇怪。
  • 我没有给你的代码示例,但我认为这必须在 DataGridColumn 级别完成,例如使用 DataGridTemplateColumn 并在 DataTemplate 中指定绑定到 value、isenabled 和背景,如果 value 为 null,则可以显示/隐藏

标签: c# wpf datagrid background triggers


【解决方案1】:

这就是我最终解决选择空单元格问题的方法。 我知道这不是最好的解决方案,但它对我有用: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?

如果您对我的解决方案有任何投诉/改进,只需添加 cmets :)。

【讨论】:

  • 如果使用 "as" 运算符和 string.IsNullOrEmpty 函数,您可以使您的代码更优雅。 var fc = col.GetCellContent(item.Item) as TextBlock; if (fc != null && string.IsNulOrEmpty(fc.Text)) ...
【解决方案2】:

我创建了一个简单的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

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

【讨论】:

  • 嗯,谢谢,我想我明白为什么 HasContent 对我不起作用,但仍然不确定如何让转换器工作,我宁愿在没有转换器的情况下尝试一些更简单的方法。跨度>
  • 是的,相同的注释 - CellConverter 需要检查 DataContext 上的属性 X,但是如果将此样式应用于所有列中的所有单元格,则您无法知道要检查哪个属性是否为 null。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 2011-04-03
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多