触发自动生成的DataGrid列

时间:2019-02-14 08:58:44

标签: c# wpf triggers datagrid

我目前在WPF项目中工作,该项目在自动生成的数据网格中处理数据。如何设置触发器,以根据空的文本框更改列的背景颜色?

我当前的用户控件XAML创建了一个网格,其中保存了数据网格。我为每个DataGridColumnHeader设置了一个新的ContentTemplate,该模板保留一个TextBlock(用于实际的标题)和一个TextBox用于过滤。

我试图为DataGridCell设置一个触发器,该触发器可以工作,但只能更改单元格的颜色。我找不到数据网格列的特定目标类型。

<UserControl x:Class="...">
<Grid>
    <DataGrid AutoGenerateColums="True" IsReadOnly="True" x:Name="MyDataGrid">
        <DataGrid.Resources>
            <Style TargetType="x:Type DataGridColumnHeader=">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock x:Name="myBlock" Text="{Binding}" TextWrapping="Wrap" />
                                <TextBox x:Name="myBox" KeyUp="KeyUpEvent" />
                            </StackPanel>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.Resources>
    </DataGrid>
</Grid>

如果TextBox中填充了内容,我希望更改数据网格列的颜色。当前,如果该列是自动生成的,我不知道如何为数据网格列设置特定的触发器。 编辑#1:诸如此类:

DataGrid with columns, rows and filter cell beneath column name

这是当数据网格未设置任何过滤器时。但是外观会发生变化,只要您在其中一个过滤器中输入过滤器文本,就像这样:

DataGrid with one filter set in the second column

编辑#2:

我能够建立一种解决方案,以编程方式为行着色,而无需给标题着色。没了你有什么建议吗?

请参见以下代码:

private void StyleRows(string text, string name)
{
    if(text != "" && column != "")
    {
        foreach(DataGridColumn column in DataGrid.Columns)
        {
            if(column.Header == column)
            {
                Style style = new Style(typeof(DataGridCell));
                style.Settes.Add(new Setter(DataGridCell.BackgroundProperty, System.Windows.Media.Brushes.Red));
                column.cellStyle = style
            }
        }
    }
}

问题: 有没有办法在XAML内做到这一点?

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

仅在XAML中无法做到

您可以尝试调整ViewModel 以为每一列提供TextBox的内容是否为空(将TextBox.Text绑定到属性并提供{{ 1}}属性以检查字符串是否为空或为空)。但这也不是“仅XAML” 解决方案。

如果您设置bool,则需要从模板观察控件并使用触发器,但是您无权访问它。

我会用CellStyle来做。编写了Behavior后,您就可以轻松地仅在XAML中使用/重用它,而无需触摸/调整后面的代码。

Behavior