DataGrid 'EditItem' не разрешен для этого представления при перетаскивании нескольких элементов. - PullRequest
7 голосов
/ 05 августа 2011

У меня есть сетка данных, которая получает такие данные:

    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» не разрешено для этого представления.

Почему это так?Это из-за способа ввода данных?
Есть идеи?
Спасибо!

Ответы [ 5 ]

10 голосов
/ 04 декабря 2012

Я получил эту проблему при назначении ItemsSource для IEnumerable .

Я исправил его, преобразовав IEnumberable в List , а затем присвоив его ItemSource.* Я не уверен, почему использование IEnumerable вызвало эту проблему, но это изменение исправило ее для меня.

10 голосов
/ 05 августа 2011

Вместо использования struct используйте class.

ОБНОВЛЕННЫЙ ОТВЕТ: попробуйте добавить свои экземпляры MyData в список, а затем назначить этот список для DataGrid.ItemsSource

1 голос
/ 13 марта 2014

Этот ответ не мой, только пример рабочего кода, предложенный 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;
1 голос
/ 03 сентября 2012

Если вы используете datagrid DataGridCheckBoxColumn, вам нужно установить <Setter Property="IsEditing" Value="true" /> на флажок флажок. Смотрите это: https://stackoverflow.com/a/12244451/1643201

0 голосов
/ 15 февраля 2018

Для моего случая

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