7

我有一个数据网格,它获取这样的数据:

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

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

4

6 回答 6

12

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

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

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

于 2012-12-04T09:19:49.560 回答
11

而不是struct使用 aclass来代替。

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

于 2011-08-04T21:55:21.423 回答
1

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

于 2012-09-03T08:40:08.000 回答
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;
于 2014-03-13T17:56:49.690 回答
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,
                            });
于 2018-02-15T14:44:06.387 回答
0

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

    public MainWindow()
    {
        InitializeComponent();
        FilterGrid.ItemsSource = ScrapeFilter;
    }
于 2020-01-10T09:07:06.170 回答