“EditItem”不允许在此视图中使用 - 数据绑定问题

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'”的错误。在广泛搜索网络后,我发现我可能还需要实现IEditableCollectionView接口。 请问有人可以帮助我提供实现此接口的指针或建议任何其他更好的方法来对自定义列表进行数据绑定吗?
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;
   }
 ...
}

你好,我尝试了这个。但是当我这样做时,我的inputList没有被填充。// 在主文件中填充inputlist的代码 { private InputList inputList; InputElement element = new InputElement(); inputList.Add(element); }// 在TestInputList中添加项目的代码 public virtual void Add(T item) { Data.Add(item); } - Scooby
是的,这解决了问题。不过我并没有使用ObservableCollection,而是在我的类中实现了IList和IList<T>接口,并使用该类的对象进行数据绑定。我将该类的对象作为数据源,并设置路径到该类中特定的属性。希望这能帮助其他遇到同样问题的人。 - Scooby

3

我也遇到了同样的异常。看起来你需要绑定到IList。我之前是绑定到IEnumerable,然后就抛出了这个异常。


1

只是要补充我的观察。我有一个在Xaml中具有特定定义列并将其ItemsSource设置为简单字典的数据网格。当我尝试编辑第二列时,我得到了指向字典的异常。然后我将数据网格ItemsSource设置为键列表(dataGrid.Keys.ToList())。然后我就可以编辑第二列了。看来列表视图允许“EditItem”。

编辑:我对此进行了更深入的研究。我设置了一个BeginningEdit处理程序并开始探索。我注意到每次都出现此错误时,EditingEventArgs.Source都是边框。如果我有时间,我可能会再深入研究一下。此外,在一个实例上,我的将字典键转换为List不起作用。尽管在我代码的所有其他地方做了基本相同类型的分配时,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;
    }

这种情况只会发生在你以某种方式物理点击单元格边框的情况下。事件的原始源是一个Border,我认为可能发生的是,与预期不同,此处传递的不是TextBox或其他可编辑元素,而是无法编辑的Border,这会导致一个异常,并将其“EditItem不允许”异常埋藏起来。在其具有无效原始源之前取消此RoutedEvent可以阻止错误发生。

很高兴找到了这个问题,因为在我的情况下,有一个DataGrid,我无法使用IList类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接