为什么我的WPF DataGrid中的一个给了“‘EditItem’不允许这种观点”异常?(Why

2019-09-21 16:03发布

我已阅读所有的Q&A,我可以在这里找到,并在有关此异常的MS论坛,并试图大部分我理解的建议,和其他几个人。 看来,这个异常可以拿出来大范围的原因。

至于其他,我有绑定到一个集合,当一个人试图编辑的一个细胞会抛出这个异常的WPF的DataGrid。 它们被设置为可写的,收藏是一个ObservableCollection,我实现了get和set其发送通知消息处理程序。

我还没有尝试过的建议是涉及实施的IList的非通用接口,因为我不知道我会做什么做到这一点的人。 另外,我有一个绑定到不同的列表和集合在我的应用程序,它的工作很多DataGrid中,而这一次使用时,它被绑定到一个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>

被编辑的列是非只读一个,偏好。

集合是:

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)

等等...

Answer 1:

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

因此,我们没必要还可以创建一个新的类,其作品在LINQ查询匿名返回类型。 它只是需要一个列表。

这里是我的代码示例:

 dtgPrdcts.ItemsSource= ProductLists.Select(Function(x) New With {.ListTitle = x.ListTitle, .ProductID = x.ProductID, .License = "", .ForRemove = True}).ToList


Answer 2:

我仍然不知道具体是什么问题引起的,但我设法解决它,我不知道有多少我所做的就是矫枉过正,但它的工作原理。

我创建了一个新的类只是为了在DataGrid行保存数据的目的。 我使这个类的对象的列表,并填写好并将其绑定到DataGrid,因为我是做之前。 我还添加了平常的东西,废话用于获取更改通知工作(可能是矫枉过正),我不得不以不同的方式重新定义一个比较函数来得到它来排序的,因为整个喜剧的局面。

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;


Answer 3:

我有这个试图建立从参加行的名单相同的问题; 由于LINQ查询返回一个IEnumerable,我必须绑定到IEnumerable的DataGrid的; 这个工作的罚款只读和用古怪和组合框我用一些其他的自定义控件的工作,但纯文本编辑扔了InvalidOperationException异常。 将溶液代替了IEnumerable的一个ObservableCollection; 基本上是从:

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

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

在这两种情况下BoundView是在DataContext为DataGrid。

我假设这是因为IEnumerable的不具有机械支持数据网格,而做的ObservableCollection。



Answer 4:

该模型类需要实现接口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

 }


文章来源: Why does one of MY WPF DataGrids give the “'EditItem' is not allowed for this view” exception?