Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf ';编辑项';不允许用于此视图-数据绑定问题_Wpf_Data Binding_Ieditablecollectionview - Fatal编程技术网

Wpf ';编辑项';不允许用于此视图-数据绑定问题

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

我正在尝试使用cutom列表在数据网格上的WPF中进行数据绑定。My custom list类包含一个list类型的私有数据列表。我不能公开这个列表,但是索引器是为了查看和获取单个项目而公开的。 我的自定义类如下所示:

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接口,并使用该类的对象进行数据绑定。我将这个类的对象作为数据源,并设置这个类中特定属性的路径。希望这能帮助其他面临同样问题的人。