c# - 尝试更改 DataGrid 中的单元格颜色时出现 WPF 表单中的 InvalidOperationException

标签 c# wpf wpfdatagrid

我不能说我是 WPF 新手,因为这太过分了。我刚刚获得了 WPF 应用程序来维护...

我需要更改 DataGrid 中的特定单元格颜色基于一个值。我以为这很容易,发现SO帖子:Change DataGrid cell colour based on values .

粘贴到它所属的位置,这给了我以下内容:

<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时在此表单上的方法,它给了我 InvalidOperationException 。我搜索了为什么会发生这种情况的解释,但没有找到明确的解释。

另外,我知道 Binding Name是我的绑定(bind)的占位符(在 <DataGridTextColumn Binding="{Binding Name}"> 中),所以我厌倦了只放置 Binding那里(受到 ItemsSource="{Binding}" 节点中 DataGrid 的启发),但没有解决问题。

最佳答案

您现在将 DataGridTextColumn 添加到 DataGrid 本身中,而不是添加到其列列表中。直接添加项目和使用 ItemsSource 是互斥的,因此会抛出 InvalidOperationException (而且您无论如何也不打算将列添加为项目)。相反,这样做:

<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 会自动从您的数据源生成列,此外您手动定义的列,您很少需要它。

关于c# - 尝试更改 DataGrid 中的单元格颜色时出现 WPF 表单中的 InvalidOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50267674/

相关文章:

c# - 将音频从一台设备流式传输到另一台设备

c# - 在 WPF 中使用全局互斥锁的正确模式是什么?

c# - 在 WPF Tabcontrol header 模板中显示 SelectedIndex

wpf - DataGridCheckBoxColumn 的单击事件

c# - 在 WPF 数据网格中复制到剪贴板失败 (CLIPBRD_E_CANT_OPEN)

c# - MVC 4 - 包含两个模型的详细信息页面

c# - 从 C# 与 Lotus Notes 交互的最佳方式和推荐做法是什么

wpf - DataGrid CurrentItem != 使用选项卡按钮重新进入后的 SelectedItem

wpf - 如何使用 DataGridCell 对象获取行索引

c# - Servicestack ormlite 错误中的计算字段