【问题标题】:How to Highlight Cell in Silverlight DataGrid如何在 Silverlight DataGrid 中突出显示单元格
【发布时间】:2011-12-08 16:34:53
【问题描述】:

如何以编程方式在 Silverlight 中突出显示 DataGrid 单元格?

【问题讨论】:

  • 您只想设置特定单元格的BackgroundColor,还是要设置显示特定数据项的某些特定属性的单元格的颜色?您希望高亮闪烁几秒钟还是在数据项在网格中可见时出现?您需要恒定颜色还是数据绑定颜色?解决方案很大程度上取决于您的要求。请提供一些详细信息。
  • 基本上只设置bgcolor。我的应用程序中有一个图表,并且我编写了一个lineseries_SelectionChanged 事件来选择图表上的一个点。给定选定的点,我想更改与图表下方数据网格上的值相对应的单元格的背景颜色(或多或少突出显示)。数据网格包含图表上的所有值。

标签: silverlight c#-4.0 silverlight-4.0


【解决方案1】:

您需要执行以下操作:

  1. 向您的数据项类添加一个属性(我们将其命名为IsSelectedInChart)。此属性必须为 public,并且必须在其值更改时引发 INotifyPropertyChanged.PropertyChanged 事件。
  2. 在您的lineseries_SelectionChanged 中,您应该找到与所选点对应的数据项,并将IsSelectedInChart 设置为true,将其设置为false
  3. 使存在于DataGrid 中的所有DataGridRow 实例都将Binding 设置为它们的Background 属性,并使用Path=IsSelectedInChart 和一个自定义的“IValueConverter”。

转换器应如下所示:

public class ValueConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
    // TODO: be more careful with nulls and non-expected values
    bool isSelected = (bool)value;
    return isSelected ? new SolidColorBrush(Colors.Red) : DependencyProperty.UnsetValue;
  }
}

最后一步是最棘手的。它可以通过覆盖DataGridRow Style 来实现。 https://*.com/a/4268159/795861 中显示了一种方法,https://*.com/a/3542179/795861 中显示了另一种方法。看看这些。

所有这些步骤都是必需的,因为您可能在 DataGrid 中有很多行。它使用UI virtualization,这使得在所需的DataGridRow 上简单地设置Background 属性成为不可能,因为单个行对象用于呈现多个数据项。因此,使其与滚动一起使用的唯一方法是将背景绑定到数据项。

更新

要突出显示在设计时已知的列中的单元格,请将 DataGridColumn.CellStyle 属性设置为该列定义,而不是设置行样式:

<sdk:DataGrid>
  <sdk:DataGrid.Columns>
    <sdk:DataGridTextColumn x:Name="theColumnToHighlight">
      <sdk:DataGridTextColumn.CellStyle>
        <Style TargetType="{x:Type sdk:DataGridCell}">
          <Setter Property="local:SetterValueBindingHelper.PropertyBinding">
            <Setter.Value>
              <local:SetterValueBindingHelper
                  Type="System.Windows.Controls.Control, System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"
                  Property="Background"
                  Binding="{Binding IsSelectedInChart, Converter={StaticResource highlighterConverter}}"/>
            </Setter.Value>
          </Setter>
        </Style>
      </sdk:DataGridTextColumn.CellStyle>
    </sdk:DataGridTextColumn>
  </sdk:DataGrid.Columns>
</sdk:DataGrid>

应该可以,虽然我没试过。 xaml 与我建议的突出显示整行的功能相同,但将其应用于特定列中的单元格。

【讨论】:

  • 呃...所以我正在尝试这样做:&lt;sdk:DataGrid.RowStyle&gt; &lt;Style TargetType="sdk:DataGridRow"&gt; &lt;Setter Property="Background" Value="{Binding Path=IsSelectedInChart, Converter={StaticResource BackgroundConverter}}" /&gt; &lt;/Style&gt; &lt;/sdk:DataGrid.RowStyle&gt; 但显然您不能将转换器添加到属性设置器?
  • 好吧,我终于用一个结合了SetterValueBindingHelper的实现来突出显示该行。我可以让它只突出显示我想要的单元格吗?
  • @John 它是您在设计时知道的特定列的单元格还是在运行时确定的列?
  • 这是我在设计时就知道的专栏。
  • 天哪!有用!非常感谢您抽出宝贵时间来写这一切。
【解决方案2】:

您可以根据 DataGrid 中的单元格模板使用此代码。 cellContent 为您提供要修改的单元格的引用。

FrameworkElement cellContent = dataGrid.Columns[0].GetCellContent(dataRow);// datarow is your row where cell intersects.
cellContent .Style = s; // assuming s is the style you want to apply

【讨论】: