拖动多个项目时,此视图不允许 DataGrid 'EditItem'

Posted

技术标签:

【中文标题】拖动多个项目时,此视图不允许 DataGrid \'EditItem\'【英文标题】:DataGrid 'EditItem' is not allowed for this view when dragging multiple items拖动多个项目时,此视图不允许 DataGrid 'EditItem' 【发布时间】:2011-10-20 09:53:40 【问题描述】:

我有一个数据网格,它可以像这样获取数据:

    public struct MyData
    
        public string name  set; get; 
        public string artist  set; get; 
        public string location  set; get; 
    

    DataGridTextColumn col1 = new DataGridTextColumn();
    col4.Binding = new Binding("name");
    dataGrid1.Columns.Add(col1);
    dataGrid1.Items.Add((new MyData()  name = "Song1", artist = "MyName", location =     "loc"));
    dataGrid1.Items.Add((new MyData()  name = "Song2", artist = "MyName", location =     "loc2"));

问题是 - 每当用户尝试编辑一个单元格或拖动多个单元格时 - 应用程序都会引发异常:

System.InvalidOperationException 未处理 消息:此视图不允许使用“EditItem”。

这是为什么?是因为输入数据的方式吗? 有什么想法吗? 谢谢!

【问题讨论】:

【参考方案1】:

我在将 ItemsSource 分配给 IEnumerable 时遇到了这个问题。

我通过将 IEnumberable 转换为 List 然后将其分配给 ItemsSource 来修复它。

我不确定为什么使用 IEnumerable 会导致该问题,但此更改为我解决了问题。

【讨论】:

因为List<T>支持Add()Remove() 同意 Jack Frost。【参考方案2】:

不要使用struct,而是使用class

更新答案:尝试将您的 MyData 实例添加到列表中,然后将该列表分配给 DataGrid.ItemsSource

【讨论】:

我把 'struct' 改成了 'class',但还是抛出了异常。 @amitarios:尝试将您的MyData 实例添加到List<MyData>,然后将该列表分配给DataGrid.ItemsSource 将其放入列表中编辑了列表,但没有编辑源对象。我错过了什么吗?【参考方案3】:

如果你使用datagrid DataGridCheckBoxColumn 你需要设置<Setter Property="IsEditing" Value="true" /> 在复选框列上。看到这个:https://***.com/a/12244451/1643201

【讨论】:

【参考方案4】:

这个答案不是我自己的,只是 AnthonyWJones 建议的工作代码示例。

public class MyData //Use class instead of struct

    public string name  set; get; 
    public string artist  set; get; 
    public string location  set; get; 


DataGridTextColumn col1 = new DataGridTextColumn();
col4.Binding = new Binding("name");
dataGrid1.Columns.Add(col1);
dataGrid1.Items.Add((new MyData()  name = "Song1", artist = "MyName", location =     "loc"));
dataGrid1.Items.Add((new MyData()  name = "Song2", artist = "MyName", location =     "loc2"));

//Create a list of MyData instances
List<MyData> myDataItems = new List<MyData>(); 
myDataItems.Add(new MyData()  name = "Song1", artist = "MyName", location =     "loc");
myDataItems.Add(new MyData()  name = "Song2", artist = "MyName", location =     "loc2");

//Assign the list to the datagrid's ItemsSource
dataGrid1.ItemsSource = items;

【讨论】:

【参考方案5】:

就我而言,

processLimits.OrderBy(c => c.Parameter);

返回一个

IOrderedEnumerable<ProcessLimits> 

不是

List<ProcessLimits>

因此,当我将事件设置器的样式分配给数据网格中的复选框列时

style.Setters.Add(new EventSetter(System.Windows.Controls.Primitives.ToggleButton.CheckedEvent, new RoutedEventHandler(ServiceActiveChecked)));

ServiceActiveChecked 从未被调用,我得到了

'EditItem' is not allowed for this view.

对于在数据网格列中进行复选框的其他任何人,我在此构造函数中使用带有列数据的列对象来添加我在添加上述样式时使用的数据网格。

datagridName.Columns.Add(new DataGridCheckBoxColumn()
                            
                                Header = column.HeaderText.Trim(),
                                Binding = new System.Windows.Data.Binding(column.BindingDataName.Trim())  StringFormat = column.StringFormat != null ? column.StringFormat.Trim().ToString() : "" ,
                                IsReadOnly = column.IsReadOnlyColumn,
                                Width = new DataGridLength(column.DataGridWidth, DataGridLengthUnitType.Star),
                                CellStyle = style,
                            );

【讨论】:

【参考方案6】:

我通过在 InitializeComponent 之后设置数据网格的源解决了这个问题:

    public MainWindow()
    
        InitializeComponent();
        FilterGrid.ItemsSource = ScrapeFilter;
    

【讨论】:

以上是关于拖动多个项目时,此视图不允许 DataGrid 'EditItem'的主要内容,如果未能解决你的问题,请参考以下文章

拖放DataGrid中下降,拖动过程中自定义光标不工作

突出显示被拖动的 TreeView 项目

在视图上自定义多个手势

将拖动的项目转换为可放置的

WPF拖动DataGrid滚动条时内容混乱的解决方法

DataGrid绑定列表字符串显示长度但不显示字符串