5

我正在尝试使用自定义列表在数据网格上的 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 接口。任何人都可以帮助我提供有关如何实现此接口的指示或任何其他更好的方法来在自定义列表上进行数据绑定吗?

4

3 回答 3

3

虽然我不完全理解您的要求,但您认为使用 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;
   }
 ...
}
于 2010-06-08T23:28:08.860 回答
3

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

于 2012-02-25T02:41:48.360 回答
1

只是为了添加我自己的观察。我有一个在 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 可阻止该错误在其轨道中发生。

很高兴发现这一点,因为在我的情况下,有一个 DataGrid,我无法在其上使用 IList 类型。

于 2011-07-19T10:18:28.387 回答