当拖动多个项目时,此视图不允许DataGrid“EditItem”操作。

7

I have a datagrid which gets data like this:

    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”。

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

6个回答

12

当我将 ItemsSource 赋值为 IEnumerable<T> 时,遇到了这个问题。

我通过将 IEnumerable<T> 转换为 List<T>,然后将其赋给 ItemsSource 来解决了这个问题。

我不确定为什么使用 IEnumerable 会导致这个问题,但是这个改变对我起了作用。


4
因为 List<T> 支持 Add()Remove() - Angshuman Agarwal
同意杰克·弗罗斯特。 - Stephen Himes

11

不要使用struct,而是使用class

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


1
我把“struct”改成了“class”,但它仍然抛出异常。 - amitairos
8
尝试将您的“MyData”实例添加到“List<MyData>”中,然后将该列表分配给“DataGrid.ItemsSource”。 - AnthonyWJones
2
将其放入列表中会编辑列表,但不会编辑源对象。我有什么遗漏吗? - Milne

2

1

这个答案不是我自己写的,只是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;

0

对于我的情况,

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,
                            });

0
我通过在InitializeComponent之后设置datagrid的源来解决了这个问题:
    public MainWindow()
    {
        InitializeComponent();
        FilterGrid.ItemsSource = ScrapeFilter;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接