C# 尝试更改DataGrid中的单元格颜色时WPF表单中的InvalidOperationException
我不能说我是WPF的新手,因为这太多了。我刚刚得到了WPF应用程序来维护 我需要根据一个值更改C# 尝试更改DataGrid中的单元格颜色时WPF表单中的InvalidOperationException,c#,wpf,wpfdatagrid,C#,Wpf,Wpfdatagrid,我不能说我是WPF的新手,因为这太多了。我刚刚得到了WPF应用程序来维护 我需要根据一个值更改DataGrid中的特定单元格颜色。我想这会很容易,发现这样的帖子: 粘贴在它所属的地方,这给了我以下信息: <DataGrid x:Name="DgDevices" ItemsSource="{Binding}" BorderThickness="2,0,2,2" Cursor="Cross"> <DataGrid.ContextMenu> <Co
DataGrid
中的特定单元格颜色。我想这会很容易,发现这样的帖子:
粘贴在它所属的地方,这给了我以下信息:
<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.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Text" Value="1">
<Setter Property="Background" Value="Black"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid>
现在,在这个表单上调用Show
方法时,它会给出invalidooperationexception
。我寻找了这种情况发生的原因,但没有找到明确的解释
另外,我知道
绑定名称
是我绑定的占位符(在
中),所以我厌倦了将绑定
放在那里(灵感来自数据网格
节点中的项资源=“{Binding}”
),但是没有解决问题。您现在正在将DataGridTextColumn
直接添加到DataGrid
本身,而不是其列列表中。直接添加项和使用ItemsSource
是互斥的,因此会抛出invalidooperationexception
(并且您并不打算将列添加为项)。相反,要这样做:
<DataGrid x:Name="DgDevices"
ItemsSource="{Binding}"
BorderThickness="2,0,2,2"
AutoGenerateColumns="False"
Cursor="Cross">
<DataGrid.ContextMenu>
<ContextMenu >
<MenuItem Header="Załóż Deblokadę" Click="InsertDBL" />
<MenuItem Header="Usuń Deblokadę" Click="RemoveDBL"/>
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Columns> <!-- add to columns -->
<DataGridTextColumn Binding="{Binding Name}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Text"
Value="1">
<Setter Property="Background"
Value="Black" />
<Setter Property="Foreground"
Value="White" />
</Trigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
另外,因为您需要将
AutoGenerateColumns
设置为False
,否则DataGrid
除了手动定义的列之外,还会自动从数据源生成列,您很少需要它。您是否尝试过删除xaml,直到它能够消除并缩小问题的范围。。。我不知道你的情况,但当我遇到奇怪的错误时,我发现它是一个非常宝贵的调试工具,正如我所解释的那样,粘贴整个
会使应用程序崩溃(直接取自前面提到的帖子)。我应该尝试删除较小的部分吗?id就是这么做的,删除较小的部分,直到它不再抛出,再添加它,直到您确定它是哪一行,然后您可以搜索更直接的答案您可以发布异常详细信息吗?我在DataGrid
的我的代码DataContext
中设置,它将列添加到已定义的列中。我可以定义所有需要的列并用DataTable
填充它们吗?或者它会一直将DataTable
列添加到现有列中?(无论如何,回答得很好,我明白了很多,+1:)@MichałTurczyn不确定我是否理解正确,但你我认为你需要看看DataGrid的AutoGenerateColumns属性。如果设置为true(默认)-它将根据您的源自动生成列。如果定义自己的列,则需要将其设置为false,然后自己定义所有列。否则-它将在您定义的列的顶部添加自动生成的列。因此,要应用您的答案,我需要将其设置为false,在XAML中定义所有列,然后填充它?是的,所有列都是自动生成的,或者所有列都是在XAML中手动定义的。因为您需要手动定义至少一列,所以您需要定义所有列。非常好,非常有用,而且非常清晰!让我仔细核对一下你的答案,然后我接受:)