WPF DataGrid:空行丢失

Dav*_*man 8 wpf datagrid wpfdatagrid

我正在创建一个带有a的WPF窗口DataGrid,我想在网格底部显示空白的"新项目"行,允许我向网格添加新项目.由于某种原因,我的窗口上的网格上没有显示空白行.这是我用来创建的标记DataGrid:

<toolkit:DataGrid  x:Name="ProjectTasksDataGrid" 
                   DockPanel.Dock="Top" 
                   Style="{DynamicResource {x:Static res:SharedResources.FsBlueGridKey}}"
                   AutoGenerateColumns="False" 
                   ItemsSource="{Binding SelectedProject.Tasks}" 
                   RowHeaderWidth="0" 
                   MouseMove="OnStartDrag" 
                   DragEnter="OnCheckDropTarget" 
                   DragOver="OnCheckDropTarget" 
                   DragLeave="OnCheckDropTarget" 
                   Drop="OnDrop" 
                   InitializingNewItem="ProjectTasksDataGrid_InitializingNewItem">
    <toolkit:DataGrid.Columns>
        <toolkit:DataGridCheckBoxColumn HeaderTemplate="{DynamicResource {x:Static res:SharedResources.CheckmarkHeaderKey}}" Width="25" Binding="{Binding Completed}" IsReadOnly="false"/>
        <toolkit:DataGridTextColumn Header="Days" Width="75" Binding="{Binding NumDays}" IsReadOnly="false"/>
        <toolkit:DataGridTextColumn Header="Due Date" Width="75" Binding="{Binding DueDate, Converter={StaticResource standardDateConverter}}" IsReadOnly="false"/>
        <toolkit:DataGridTextColumn Header="Description" Width="*" Binding="{Binding Description}" IsReadOnly="false"/>
    </toolkit:DataGrid.Columns>
</toolkit:DataGrid>
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么空白行没有显示.我尝试了明显的东西(IsReadOnly="false",CanUserAddRows="True"),没有运气.知道空行被禁用的原因吗?谢谢你的帮助.

小智 61

您还必须在集合中的类型上具有默认构造函数.

  • 这是应该检查的答案>.<感谢随机用户! (5认同)

Ree*_*sey 5

Vincent Sibal发表了一篇文章,描述了向DataGrid添加新行所需的内容.有很多可能性,其中大部分取决于您使用的集合类型SelectedProject.Tasks.

我建议确保"任务"不是只读集合,并且它支持所需的接口之一(在上一个链接中提到),以允许使用DataGrid正确添加新项目.

  • 实际上,Tasks是一个ObservableCollection <T>.我做了一个将数据网格绑定到同一类集合的测试项目,并且空行位于网格的底部.文森特的博客文章很好,但他觉得你必须实现IEditableObject,但实际情况并非如此.绑定到ObservableCollection <T>的普通vanilla DataGrid应显示空行.请参阅http://www.codeproject.com/KB/WPF/MVVM_DataGrid.aspx. (3认同)

Dav*_*man 5

终于回到了这个.我不打算改变接受的答案(绿色复选标记),但这是问题的原因:

My View Model包装域类以提供WPF所需的基础结构.我在我使用的wrap方法上写了一篇CodeProject文章,其中包含一个有两个类型参数的集合类:

VmCollection<VM, DM>
Run Code Online (Sandbox Code Playgroud)

其中DM是包装域类,DM是包装它的WPF类.

事实证明,由于一些奇怪的原因,在集合类中使用第二个类型参数会导致WPF DataGrid无法编辑.修复是消除第二个类型参数.

不能说为什么会这样,只有它确实如此.希望它可以帮助其他人.


Bre*_*ett 5

在我看来,这是DataGrid中的一个错误. Mike Blandford的链接帮助我最终意识到问题所在:DataGrid在绑定真实对象之前无法识别行的类型.编辑行不会出现b/c数据网格不知道列类型.您会认为绑定强类型集合会起作用,但事实并非如此.

要扩展Mike Blandford的答案,您必须先分配空集合,然后添加和删除一行.例如,

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        // data binding
        dataGridUsers.ItemsSource = GetMembershipUsers();
        EntRefUserDataSet.EntRefUserDataTable dt = (EntRefUserDataSet.EntRefUserDataTable)dataGridUsers.ItemsSource;
        // hack to force edit row to appear for empty collections
        if (dt.Rows.Count == 0)
        {
            dt.AddEntRefUserRow("", "", false, false);
            dt.Rows[0].Delete();
        }
    }
Run Code Online (Sandbox Code Playgroud)