【问题标题】:WPF DataGrid - issues with blank rowWPF DataGrid - 空白行问题
【发布时间】:2020-12-13 08:45:16
【问题描述】:

我有一个 DataGrid,其 ItemsSource 绑定到 <ObservableCollection<MyItem>()

MyItem 是一个只有两个公共字符串的类。它有一个默认构造函数(将Text1 设置为某物,将Text2 设置为某物(即“test1”和“test2”)。

对于 DataGrid,我将 CanUserAddRows 设置为 True 并且 IsReadOnlyFalse

然而 DataGrid 没有正确添加空白行。我的意思是它总是在底部打开一个空白行,但是这个额外的空白行没有设置默认值——我在MyItem 的默认构造函数中留下的那些)。整个行也有点像空(?)。我知道,因为我有一些 XAML 绑定到背景/前景单元格颜色和 - 在我手动添加的行(MyItems)上,在我将整个 ObservableCollection 绑定到 DataGrid 之前) - 这些颜色绑定工作正常。在这个奇怪的新空白行上,他们失败了(说他们“...无法转换 MS.Internal.Namedobject...”)。

还有一个问题 - 当我开始编辑这个奇怪的空白行时,DataGrid 的底部永远不会自动添加新行。即使在按 Enter 后,在单元格文本编辑后也不会。在 WinForms 中,当至少有一个单元格被触摸时,新的空白行总是自动出现(甚至没有改变值,在单击空白单元格后立即)。

我错过了什么?

【问题讨论】:

  • 请提供MyItem类的代码和绑定的xaml

标签: wpf datagrid


【解决方案1】:

我找到了原因。对于 DataGridTemplateColumn,CellTemplate 和 CellEditingTemplate 都不能是 TextBox。当我将 CellTemplate 更改为 TextBlock 时,它开始正常工作。

【讨论】:

    【解决方案2】:
    public class MyItem
    {
       public string Text1 { get; set; }
       public string Text2 { get; set; }
    
       public MyItem()
       {
           Text1 = "test1";
           Text2 = "test2";
       }
    }
    
    /* ... XAML ... */
    
    <DataGrid x:Name="dataGrid"
                      AutoGenerateColumns="False"
                      CanUserAddRows="True"
                      CanUserDeleteRows="True"
                      CanUserReorderColumns="False"
                      CanUserResizeColumns="False"
                      CanUserResizeRows="False"
                      CanUserSortColumns="False"
                      CellStyle="{StaticResource dataGridCell}"
                      SelectionMode="Single"
                      SelectionUnit="FullRow">
                <DataGrid.Columns>
                    <DataGridTemplateColumn Width="1*">
                        <DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Path=Text1}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellEditingTemplate>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Path=Text1}"
                                         TextChanged="TextBox1_TextChanged" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Width="1*">
                        <DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Path=Text2}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellEditingTemplate>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Path=Text2}"
                                         TextChanged="TextBox2_TextChanged" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
    
    

    【讨论】: