我目前在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:诸如此类:
这是当数据网格未设置任何过滤器时。但是外观会发生变化,只要您在其中一个过滤器中输入过滤器文本,就像这样:
编辑#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内做到这一点?
谢谢您的帮助!
答案 0 :(得分:0)
仅在XAML中无法做到。
您可以尝试调整ViewModel 以为每一列提供TextBox
的内容是否为空(将TextBox.Text
绑定到属性并提供{{ 1}}属性以检查字符串是否为空或为空)。但这也不是“仅XAML” 解决方案。
如果您设置bool
,则需要从模板观察控件并使用触发器,但是您无权访问它。
我会用CellStyle
来做。编写了Behavior
后,您就可以轻松地仅在XAML中使用/重用它,而无需触摸/调整后面的代码。
Behavior