【问题标题】:'EditItem' is not allowed for this view - databinding issue此视图不允许使用“EditItem” - 数据绑定问题
【发布时间】:2011-03-01 10:22:09
【问题描述】:

我正在尝试使用自定义列表在数据网格上的 WPF 中进行数据绑定。我的自定义列表类包含List<T> 类型的私有数据列表。我无法公开此列表,但是公开索引器以设置和获取单个项目。 我的自定义类如下所示:

public abstract class TestElementList<T> : IEnumerable
        where T : class
{
    protected List<T> Data { get; set; }
    public virtual T Get(int index)
    {
        T item = Data[index];
        return item;
    }

    public virtual void Set(int index, T item)
    {
         Data[index] = item;
    }
...
}

数据已绑定,但当我尝试编辑它时,我收到'EditItem' is not allowed for this view 错误。在通过网络进行广泛搜索时,我发现我可能还需要实现 IEditableCollectionView 接口。 任何人都可以帮助我提供有关如何实现此接口的指示或任何其他更好的方法来对自定义列表进行数据绑定吗?

【问题讨论】:

    标签: wpf data-binding ieditablecollectionview


    【解决方案1】:

    虽然我没有完全理解您的要求,但您认为使用 ObservableCollection 会解决您的问题吗?

    public abstract class TestElementList<T> : ObservableCollection<T>
        where T : class
     {
       public virtual T Get(int index)
       {
         T item = this[index];
         return item;
       }
    
       public virtual void Set(int index, T item)
       {
         this[index] = item;
       }
     ...
    }
    

    【讨论】:

    • 嗨,我试过了。但是当我这样做时,我的 inputList 没有被填充。 // 在主文件中填充输入列表的代码 { private InputList inputList; InputElement 元素 = 新的 InputElement(); inputList.Add(元素); } // TestInputList 中添加项目的代码 public virtual void Add(T item) { Data.Add(item); }
    • 是的,虽然不是 ObservableCollection,但我为我的类实现了 Ilist 和 Ilist 接口,并使用此类的对象进行数据绑定,但这解决了它。我将此类的对象作为数据源,并设置此类中特定属性的路径。希望这对面临同样问题的其他人有所帮助。
    【解决方案2】:

    只是添加我自己的观察。我有一个在 Xaml 中具有明确定义的列的数据网格,并且它的 ItemsSource 设置为一个简单的字典。当我试图编辑第二列时,我得到了这个引用字典的异常。然后,我将数据网格 ItemsSource 设置为键列表 (dataGrid.Keys.ToList())。然后我可以编辑第二列。似乎列表视图允许“EditItem”。

    编辑:对此进行了更多挖掘。我设置了一个BeginningEdit 处理程序并开始四处寻找。我注意到的一件事是,每次我收到此错误时,EditingEventArgs.Source 都是一个边框。如果我能找到时间,我可能会进一步研究这个。此外,在一个实例中,我将字典键转换为 List 不起作用。我不得不将它转换为 Observable 集合,尽管 List 适用于我的代码中的所有其他地方,我在这些地方进行了基本相同类型的赋值。

    再次编辑:好的,对于那些使用 IList 类型不起作用的问题,我还有另一个修复方法。将一个BeginningEdit 处理程序附加到您的DataGrid 并指向此代码:

        private void Grid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
            //// Have to do this in the unusual case where the border of the cell gets selected
            //// and causes a crash 'EditItem is not allowed'
            e.Cancel = true;
        }
    

    只有当你设法以物理方式点击单元格的边界时,才会发生这种情况。事件的 OriginalSource 是一个边框,我认为我在这里发生的事情不是 TextBox,或者其他可编辑元素是预期的源,这个不可编辑的边框是通过编辑来进行的,这会导致一个隐藏在 '不允许 EditItem 的例外。在此 RoutedEvent 使用其无效的 Original Source 冒泡通过之前取消此 RoutedEvent 可阻止该错误在其轨道中发生。

    很高兴找到这个,因为在我的例子中,有一个我不能使用 IList 类型的 DataGrid。

    【讨论】:

      【解决方案3】:

      我也有同样的例外。看来你必须绑定做IList。我绑定到一个 IEnumerable 并且抛出了这个异常。

      【讨论】:

        猜你喜欢
        • 2012-01-30
        • 2013-11-30
        • 2013-09-05
        • 2013-10-20
        • 2011-09-13
        • 2017-04-26
        • 2011-10-20
        • 1970-01-01
        相关资源
        最近更新 更多