Wpf ';编辑项';不允许用于此视图-数据绑定问题
我正在尝试使用cutom列表在数据网格上的WPF中进行数据绑定。My custom list类包含一个list类型的私有数据列表。我不能公开这个列表,但是索引器是为了查看和获取单个项目而公开的。 我的自定义类如下所示:Wpf ';编辑项';不允许用于此视图-数据绑定问题,wpf,data-binding,ieditablecollectionview,Wpf,Data Binding,Ieditablecollectionview,我正在尝试使用cutom列表在数据网格上的WPF中进行数据绑定。My custom list类包含一个list类型的私有数据列表。我不能公开这个列表,但是索引器是为了查看和获取单个项目而公开的。 我的自定义类如下所示: public abstract class TestElementList<T> : IEnumerable where T : class { protected List<T> Data { get; set; } pu
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;
}
...
}
public抽象类TestElementList:IEnumerable
T:在哪里上课
{
受保护列表数据{get;set;}
公共虚拟T Get(int索引)
{
T项=数据[索引];
退货项目;
}
公共虚拟无效集(整数索引,T项)
{
数据[索引]=项目;
}
...
}
数据已绑定,但当我尝试编辑它时,我得到“'EditItem'不允许用于此视图。”错误。在通过web进行广泛搜索时,我发现可能还需要实现IEditableCollectionView接口。
任何人都可以帮助我提供如何实现这个接口的指针,或者提供任何其他更好的方法在自定义列表上进行数据绑定的建议
提前感谢。虽然我不完全理解您的要求,但您认为使用可观察的收集将解决您的问题吗
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;
}
...
}
公共抽象类TestElementList:ObservableCollection
T:在哪里上课
{
公共虚拟T Get(int索引)
{
T项=该[指数];
退货项目;
}
公共虚拟无效集(整数索引,T项)
{
此[索引]=项目;
}
...
}
只需添加我自己的观察。我有一个datagrid,在Xaml中有专门定义的列,它的ItemsSource设置为一个简单的字典。当我试图编辑第二列时,我遇到了一个异常,这是指字典。然后,我将数据网格项资源设置为键列表(dataGrid.Keys.ToList())。然后我可以编辑第二列。列表视图似乎允许使用“EditItem”
编辑:对此做了进一步的挖掘。我设置了一个BeginingEdit处理程序并开始四处搜索。我注意到的一件事是,每次我遇到这个错误,EditingEventArgs.Source就是一个边框。如果我能抽出时间,我可能会进一步研究这个问题。此外,在一个实例中,我将字典键转换为列表的操作不起作用。我必须将其转换为一个可观察的集合,尽管事实上列表适用于我代码中的所有其他地方,我在这些地方执行的任务基本相同
再次编辑:好的,对于那些使用IList类型不起作用的问题,我有另一个解决方案。将BeginingEdit处理程序附加到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是一个边框,我想这里发生的不是一个文本框,或者其他可编辑元素,而是一个源,这个不可编辑的边框用于编辑,这会导致一个隐藏在“EditItem is not allowed”异常中的异常。取消此RoutedEvent之前,它可以冒泡通过其无效的原始源停止错误发生在其轨道上
很高兴发现了这一点,因为在我的例子中,有一个DataGrid,我无法在其上使用IList类型 我也有同样的例外。看来你得把它绑起来了。我绑定到IEnumerable时抛出了此异常。您好,我尝试了此操作。但是当我这样做时,我的输入列表不会被填充用于在主文件{private inputlist inputlist;InputElement element=new InputElement();inputlist.Add(element);}//中填充inputlist的代码用于在TestInputList中添加项公共虚拟空添加(T项){Data.Add(item);}是,这解决了此问题,但不是ObservaleCollection,我为我的类实现了Ilist和Ilist接口,并使用该类的对象进行数据绑定。我将这个类的对象作为数据源,并设置这个类中特定属性的路径。希望这能帮助其他面临同样问题的人。