2

我已经阅读了我可以在此处和 MS 论坛上找到的有关此异常的所有问答,并尝试了我理解的大多数建议以及其他一些建议。似乎这个例外可能是由多种原因引起的。

与其他人一样,我有一个 WPF DataGrid 绑定到一个集合,当尝试编辑其中一个单元格时会引发此异常。它们被设置为可写,集合是 ObservableCollection,我已经实现了发送通知消息的 get 和 set 处理程序。

我没有尝试过的建议是那些涉及实现 IList 的非通用接口的建议,因为我不知道我会做什么。此外,我有许多 DataGrids 绑定到我的应用程序中的各种列表和集合,它们可以工作,而这个曾经在绑定到 LINQ 集合时工作。

请帮我弄清楚我需要在这里做什么。

数据网格是:

<DataGrid Name="dgIngredients" Margin="567,32,0,44" Width="360" ItemsSource="{Binding}" IsReadOnly="False"
           AutoGenerateColumns="False" HorizontalAlignment="Left" CanUserAddRows="False" CanUserDeleteRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Width="63" Header="Percent" Binding="{Binding Preference}" IsReadOnly="False" />
        <DataGridTextColumn SortDirection="Descending" Width="301" Header="Ingredient" Binding="{Binding Ingredient}" IsReadOnly="True" CanUserSort="True" CanUserReorder="False" />
    </DataGrid.Columns>
</DataGrid>

正在编辑的列是非只读列,Preference。

该系列是:

private ObservableCollection<RAM_Ingredient> MemberIngredientPrefs = new ObservableCollection<RAM_Ingredient>();

绑定是:

dgIngredients.DataContext = MemberIngredientPrefs.OrderBy("Ingredient",true);

RAM_Ingredient 是:

public class RAM_Ingredient : INotifyPropertyChanged 

等等

RAM_Ingredient.Preference 是:

private int _Preference;
public int Preference
{
    get
    {
        return _Preference;
    }
    set
    {
        // This is needed to send notification of changes (and to not throw an exception on grid edit!):
        if ((_Preference != value))
        {
            SendPropertyChanging();
            _Preference = value;
            SendPropertyChanged("Preference");
        }
    }
}

例外是:

System.InvalidOperationException was unhandled
  Message='EditItem' is not allowed for this view.
  Source=PresentationFramework
  StackTrace:
       at System.Windows.Controls.ItemCollection.System.ComponentModel.IEditableCollectionView.EditItem(Object item)
       at System.Windows.Controls.DataGrid.EditRowItem(Object rowItem)
       at System.Windows.Controls.DataGrid.OnExecutedBeginEdit(ExecutedRoutedEventArgs e)

ETC...

4

6 回答 6

4

我也有这个问题,发现这里的重点是我们不能在DataGrid中编辑一个IEnumerable,只能编辑一个列表。

因此我们不需要创建一个新类,它也适用于具有匿名返回类型的 LINQ 查询。它只需要是一个列表。

这是我的代码示例:

 dtgPrdcts.ItemsSource= ProductLists.Select(Function(x) New With {.ListTitle = x.ListTitle, .ProductID = x.ProductID, .License = "", .ForRemove = True}).ToList
于 2013-08-12T14:32:55.597 回答
2

我仍然不知道具体是什么导致了这个问题,但我设法解决了这个问题,我不确定我所做的有多少是矫枉过正的,但它确实有效。

我创建了一个新类,只是为了将数据保存在 DataGrid 行中。我制作了一个此类的对象列表,并像以前一样将其填写并绑定到 DataGrid。我还添加了通常的东西和废话,以使更改通知正常工作(可能是矫枉过正),由于整个喜剧情况,我不得不以不同的方式重新定义比较函数以使其排序。

IE

List<UsablePref> MemberIngredientPrefs = new List<UsablePref>();

...

            foreach (RAM_Ingredient ingredient in App.Ingredients)
        {
            ingredient.GetPreferences(EditorMember);
            UsablePref pref = new UsablePref();
            pref.Ingredient = ingredient.Ingredient;
            pref.IngredientID = ingredient.IngredientID;
            pref.Preference = ingredient.Preference;
            MemberIngredientPrefs.Add(pref);
        }

        // Sort alphabetically by ingredient name, 
        MemberIngredientPrefs.Sort(UsablePref.CompareByName);
        // and bind the ingredient prefs DataGrid to its corresponding List
        dgIngredients.DataContext = MemberIngredientPrefs;
于 2012-08-27T02:34:15.533 回答
1

我在尝试从连接中创建行列表时遇到了同样的问题;由于 LINQ 查询返回一个 IEnumerable,我将 DataGrid 绑定到该 IEnumerable;这对于 readonly 工作正常,并且奇怪地与 ComboBoxes 和我使用的其他一些自定义控件一起工作,但是纯文本编辑抛出了 InvalidOperationException。解决方案是用 ObservableCollection 代替 IEnumerable;基本上来自:

BoundView = (/*LINQ QUERY*/); // is IEnumerable<CustomJoinObject>

BoundView = new ObservableCollection<CustomJoinObject>(/*LINQ QUERY*/);

在这两种情况下,BoundView 都是 DataGrid 的 DataContext。

我假设发生这种情况是因为 IEnumerable 没有支持数据网格的机制,而 ObservableCollection 有。

于 2016-04-28T19:45:19.750 回答
1

模型类需要实现INotifyPropertyChanged来自命名空间的接口System.ComponentModel

类示例:

 public class Exemple :  INotifyPropertyChanged
 {
   #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

        #endregion INotifyPropertyChanged Members

 }
于 2019-05-23T16:30:39.353 回答
1

即使这个线程很旧,它也可以帮助某人。问题是 LINQ 返回一个 IEnumerable,正如 VaelynPhi 所说,但原因是编辑数据网格需要一个实现IEditableCollectionView的源。然后,您可以使用列表、observableCollection 或任何实现此接口的集合。

我找到了这个解决方案,感谢Shoe给出了这个问题的答案。

于 2020-02-19T10:22:23.930 回答
1

在我的情况下,当我想编辑一些单元格时抛出了这个异常。当我切换到一切正常时,问题是绑定到ItemSource=>的集合类型错误。IEnumerable<T>ObservableCollection<T>

于 2021-11-04T15:20:15.023 回答