尝试更改DataGrid

时间:2018-05-10 07:22:02

标签: 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是我绑定的占位符(在<DataGridTextColumn Binding="{Binding Name}">中),所以我累了只放BindingItemsSource="{Binding}"的灵感来自DataGrid }}}},但没有解决问题。

1 个答案:

答案 0 :(得分:4)

您现在正在将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会自动生成数据源中的列,此外还有您手动定义的列,而您很少需要这一点。