WPF窗体修改DataGrid单元格颜色时触发InvalidOperationException异常
嘿,我懂你维护老WPF项目遇到奇怪异常的头疼感——毕竟XAML的坑有时候真的让人摸不着头脑。咱们一步步来排查你遇到的问题:
首先排查最容易忽略的点:事件处理方法是否存在
看你的XAML里定义了ContextMenu的两个MenuItem,分别绑定了InsertDBL和RemoveDBL点击事件。如果你的后台代码(比如.xaml.cs文件)里没有实现这两个方法,或者方法的签名不符合要求(必须是void 方法名(object sender, RoutedEventArgs e)的格式),那么在窗体加载时就会直接抛出InvalidOperationException,因为WPF找不到对应的事件处理程序。
先检查后台代码里有没有类似这样的实现:
private void InsertDBL(object sender, RoutedEventArgs e) { // 你的逻辑代码 } private void RemoveDBL(object sender, RoutedEventArgs e) { // 你的逻辑代码 }
如果没有,补上就好;如果有,检查参数类型是否正确。
其次,调整单元格样式的触发目标
你现在是给TextBlock设置背景色,但DataGrid的单元格(DataGridCell)本身有默认背景,可能会覆盖TextBlock的样式,而且直接绑定TextBlock的Text属性也容易因为类型转换出问题(比如你的Name属性如果是int类型,虽然会自动转成字符串,但触发匹配的可靠性不如直接绑定数据源属性)。
建议把样式改成针对DataGridCell,并直接绑定数据源的属性:
<DataGrid x:Name="DgDevices" ItemsSource="{Binding}" BorderThickness="2,0,2,2" Cursor="Cross"> <DataGrid.ContextMenu> <ContextMenu> <MenuItem Header="Załóż Deblokadę" Click="InsertDBL" /> <MenuItem Header="Usuń Deblokadę" Click="RemoveDBL"/> </ContextMenu> </DataGrid.ContextMenu> <DataGridTextColumn Binding="{Binding Name}"> <DataGridTextColumn.CellStyle> <Style TargetType="{x:Type DataGridCell}"> <Style.Triggers> <!-- 如果Name是字符串类型,用Value="1";如果是数值类型,用Value=1 --> <DataTrigger Binding="{Binding Name}" Value="1"> <Setter Property="Background" Value="Black"/> <Setter Property="Foreground" Value="White"/> </DataTrigger> </Style.Triggers> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> </DataGrid>
这样直接针对单元格设置样式,不仅能确保背景色生效,还能避免Text属性转换带来的潜在问题。
最后检查数据源绑定是否正常
确保在调用窗体Show()方法之前,已经给DgDevices的DataContext或者ItemsSource赋值了有效的集合对象。如果数据源是null,或者集合里的对象没有Name属性,也可能触发绑定相关的异常。你之前改成{Binding}是绑定整个对象,这时候要确保对象本身的ToString()结果是"1"才能触发样式,但这显然不是你想要的,所以还是建议绑定具体的Name属性,并确认数据源正确。
按照这几个步骤排查,应该能解决你的InvalidOperationException问题。
内容的提问来源于stack exchange,提问作者Michał Turczyn

