绑定到WPF DataGrid时,此视图不允许使用DataGrid版本的“EditItem”

我一直在阅读这个至少4个小时,似乎是列表类型,但我有一个情况:

具有集合属性的ObservableCollection。

我定义了第一个DataGrid,并在该部分中

     

一切顺利,屏幕上的所有内容都如我所料……但是:

  1. 如果尝试修改DataGrid1单元格,它允许我。
  2. 如果尝试修改DataGrid2单元格,则会抛出此exception'EditItem' is not allowed for this view

我错过了什么?

这是我的模特:

 public partial class Level1 { public Level1() { this.Level2 = new HashSet(); } public decimal IdLevel1 { get; set; } public decimal IdLevel2 { get; set; } public string StrDescripcionTipoAsociado {get;set;} public virtual Level2 Level2{ get; set; } } public partial class Level2 { public decimal IdLevel1 { get; set; } public decimal IdLevel3 { get; set; } public virtual Level3 Level3{ get; set; } } public partial class Level3 { public decimal IdLevel3 { get; set; } public decimal NumIdConcepto {get;set;} public string StrDescripcionConcepto {get;set;} } 

编辑:XAML代码:

        

我试过这个,问题是你已经将Level2集合初始化为Hashset<>IEditableCollectionView.EditItem()在尝试更新Hashset<>项时抛出此错误。 我将集合初始化为List<> ,它工作正常。

我不确定为什么它无法更新hashset中的项目,需要深入研究它。 但是将Hashset<>更改为List<>将修复此错误。

希望能帮助到你

谢谢

你可以试试这个。 将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是一个Border,我认为这里可能发生的不是TextBox,或者其他可编辑的元素是预期的来源,这个不可编辑的Border进行编辑,导致一个exception埋藏在’不允许使用EditItem’例外。 取消此RoutedEvent之前,它可以通过其无效的OriginalSource冒泡,停止在其轨道中发生该错误。

请给@nit谁给我正确的道路。 当然,问题在于基本的EF集合类型

Hashet 和Datagrid至少需要一个List ,改变我所有的类“由Entity framework生成的那些”,给我另一个问题,必须手动进行更改,而且我有很多。

我的解决方案是创建一个转换器,使我的脏工作:

 public class listToObservableCollection : BaseConverter, IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { HashSet observableList = (HashSet)value; return new ObservableCollection(observableList); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return (HashSet)value; } } public abstract class BaseConverter : MarkupExtension { public override object ProvideValue(IServiceProvider serviceProvider) { return this; } } 

并把它放在我的Datagrid2的绑定上:

  xmlns:l="clr-namespace:Recursos;assembly=Recursos" ...   ...  ItemsSource="{Binding Level2,Converter={StaticResource listoToObservable}}" 

唯一的问题是如何制作通用转换器,但现在它工作正常。

我也使用IsReadOnly="True"解决了这个问题。

这是我使用的通用转换器

 public class ObservableCollectionConverter: IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var observableType= typeof (ObservableCollection<>).MakeGenericType(value.GetType().GetGenericArguments()); return Activator.CreateInstance(observableType, value); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { var observableType = typeof(HashSet<>).MakeGenericType(value.GetType().GetGenericArguments()); return Activator.CreateInstance(observableType, value); } } 

你可以设置IsReadOnly属性。 也许不会发生exception…在xaml文件中尝试..

 IsReadOnly="True" 

你可以用更短的方式写:

 DataGrid.BeginningEdit += (s, ss) => ss.Cancel = true; 

我解决了这个问题,将我的数据网格置于只读模式

  

….