绑定到WPF DataGrid时,此视图不允许使用DataGrid版本的“EditItem”
我一直在阅读这个至少4个小时,似乎是列表类型,但我有一个情况:
具有集合属性的ObservableCollection。
我定义了第一个DataGrid,并在该部分中
一切顺利,屏幕上的所有内容都如我所料……但是:
- 如果尝试修改DataGrid1单元格,它允许我。
- 如果尝试修改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
我的解决方案是创建一个转换器,使我的脏工作:
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;
我解决了这个问题,将我的数据网格置于只读模式
….