拖动多个项目时,此视图不允许使用DataGrid“EditItem”

时间:2011-08-04 21:53:03

标签: wpf datagrid invalidoperationexception

我有一个datagrid,它可以获取如下数据:

    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 个答案:

答案 0 :(得分:10)

而不是使用struct代替使用class

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

答案 1 :(得分:10)

将ItemsSource分配给IEnumerable< T>时出现此问题。

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

我不确定为什么使用IEnumerable导致了这个问题,但是这个更改为我修复了它。

答案 2 :(得分:1)

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

答案 3 :(得分: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;

答案 4 :(得分:0)

就我而言,

IOrderedEnumerable<ProcessLimits> 

返回

List<ProcessLimits>

不是

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

所以我将事件设置器的样式分配给datagrid中的复选框列

'EditItem' is not allowed for this view.

从未调用过ServiceActiveChecked,我得到了

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

对于在datagrid列中执行复选框的其他人,我在此构造函数中使用带有列数据的列对象来添加我使用的数据网格,并添加上面的样式。

{{1}}

答案 5 :(得分:0)

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

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