Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试更改DataGrid中的单元格颜色时WPF表单中的InvalidOperationException_C#_Wpf_Wpfdatagrid - Fatal编程技术网

C# 尝试更改DataGrid中的单元格颜色时WPF表单中的InvalidOperationException

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

我不能说我是WPF的新手,因为这太多了。我刚刚得到了WPF应用程序来维护

我需要根据一个值更改
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中手动定义的。因为您需要手动定义至少一列,所以您需要定义所有列。非常好,非常有用,而且非常清晰!让我仔细核对一下你的答案,然后我接受:)