我正在尝试使用cutom列表在数据网格上的WPF中进行数据绑定。我的自定义列表类包含List类型的私有数据列表。我不能公开这个列表,但是索引器会被公开用于seeting和获取单个项目。 我的自定义类看起来像这样:
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'不允许这个视图。”错误。在通过Web进行广泛搜索时,我发现我可能还需要实现IEditableCollectionView接口。 任何人都可以帮我指点如何实现这个接口或任何其他建议在自定义列表上进行数据绑定的更好方法。
提前致谢。
答案 0 :(得分: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;
}
...
}
答案 1 :(得分:3)
我有同样的例外。看来你必须绑定做IList。我绑定了一个IEnumerable,抛出了这个异常。
答案 2 :(得分:0)
只是添加我自己的观察。我有一个数据网格,在Xaml中有专门定义的列,其ItemsSource设置为一个简单的字典。当我尝试编辑第二列时,我得到了关于字典的这个例外。然后我将数据网格ItemsSource设置为Keys的列表(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之前,它可以通过其无效的原始源进行冒泡,停止在其轨道中发生该错误。
很高兴找到这个,因为在我的情况下,我不能使用IList类型的DataGrid。