6

所有,我正在尝试DataGrid使用 for each 循环遍历 WPF 以更改错误单元格的背景颜色。我检查了很多问题,但我还没有找到足够的答案。到目前为止我所拥有的是

public void RunChecks()
{
    const int baseColumnCount = 3;
    foreach (DataRowView rv in dataGrid.Items)
    {
        for (int i = baseColumnCount; i < dataGrid.Columns.Count; i++)
        {
            if (!CheckForBalancedParentheses(rv.Row[i].ToString()))
            {
                Color color = (Color)ColorConverter.ConvertFromString("#FF0000");
                row.Background = new SolidColorBrush(color); // Problem!
            }
        }
    }
}

问题是,为了更改Background我的行的颜色,DataGrid我需要使用DataGridRowDataRowView rv.

如何DataGridRow从对象rv( DataRowView) 中获取对 的引用?

谢谢你的时间。

编辑。根据下面的建议,我现在有以下样式,它适用于鼠标悬停事件并设置相关单元格的前后字体。但是,对于如何在上面的代码中在运行时将背景色应用于单元格,我真的很迷茫。XML 样式是

<Window.Resources>
    <Style TargetType="{x:Type DataGridRow}">
        <Style.Triggers>
            <Trigger Property="IsMouseOver"
                     Value="True">
                <Setter Property="Background" Value="Red" />
                <Setter Property="FontWeight" Value="ExtraBold" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
4

5 回答 5

5

使用 WPF 时,请避免始终直接访问 UI 工件。

在您的 ModelView 中创建属性 Color,并将其绑定到 DataGrid 视图的单行模板的背景颜色。

因此,为了更改颜色,您将循环抛出 ModelView 集合并设置/读取绑定到每一行的每个对象的 Color 属性。通过更改它,如果绑定设置正确,您将影响行 UI 颜色外观。

对于具体示例,您可以查看:

如何将数据网格行的背景绑定到特定颜色?

于 2013-03-27T11:12:22.840 回答
2

您可以使用ItemContainerGenerator来获取数据的可视化表示,即DataGridRow-

DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator
                                       .ContainerFromItem(rv);
于 2013-03-27T11:12:23.597 回答
1

“Killercam”的答案对我有用,但我需要补充:

myDataGrid.UpdateLayout();

在使用 GetCell 方法之前,我确定我没有得到空引用。

让整个 Helper 类看看DataGridHelper

在经历了所有的痛苦之后,我尝试了整个代码,我遇到了另一个问题,即正确颜色的单元格在滚动过程中发生了变化,解决方案是启用虚拟化并将其模式设置为标准。

VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Standard"

所以,希望这将帮助任何需要遍历数据网格单元的人。

于 2013-09-23T10:58:08.917 回答
0

经过大量阅读,我找到了一种方法来做我想做的事 - 根据某些条件在运行时为单元格着色。这是我用来上色的方法

public void RunChecks()
{
    const int baseColumnCount = 3;
    for (int i = baseColumnCount; i < dataGrid.Columns.Count; i++)
    {
        foreach (DataGridRow row in Utilities.GetDataGridRows(dataGrid))
        {
            if (row != null)
            {
                DataGridCell cell = dataGrid.GetCell(row, i);

                // Start work with cell.
                Color color;
                TextBlock tb = cell.Content as TextBlock;
                string cellValue = tb.Text;
                if (!CheckForBalancedParentheses(cellValue))
                    color = (Color)ColorConverter.ConvertFromString("#FF0000");
                else
                    color = (Color)ColorConverter.ConvertFromString("#FFFFFF");
                row.Background = new SolidColorBrush(color);
                //cell.Background = new SolidColorBrush(color);
            }
        }
    }
}

这些是所需的相关实用程序方法

public static T GetVisualChild<T>(Visual parent) where T : Visual
{
    T child = default(T);
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < numVisuals; i++)
    {
        Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
        child = v as T;
        if (child == null)
            child = GetVisualChild<T>(v);
        if (child != null)
            break;
    }
    return child;
}

public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int column)
{
    if (row != null)
    {
        DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
        if (presenter == null)
        {
            grid.ScrollIntoView(row, grid.Columns[column]);
            presenter = GetVisualChild<DataGridCellsPresenter>(row);
        }
        DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
        return cell;
    }
    return null;
}

public static IEnumerable<DataGridRow> GetDataGridRows(DataGrid grid)
{
    var itemsSource = grid.ItemsSource as IEnumerable;
    if (null == itemsSource) yield return null;
    foreach (var item in itemsSource)
    {
        var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
        if (null != row) yield return row;
    }
}

但是请注意,当用户滚动时,单元格的颜色会从一个单元格移动到另一个单元格!?这是 WPF 的另一个令人惊奇的烦恼。我真的很困惑为什么这么简单的事情会变得如此困难。我们需要对这种事情使用 MVVM 类型模式的建议我觉得很神奇......

我希望这对其他人有帮助。

于 2013-03-27T14:20:15.637 回答
0
//the Class that resembles the Datagrid Item schema

foreach (Class cl in dgDatagrid.Items)
   {
       MessageBox.Show(cl.ID.ToString());
   }

this is the most simplest way to read the datagrid data
most articles misguide such simple things
于 2017-09-13T15:14:20.593 回答