DataGrid版本';编辑项目';当绑定到WPF DataGrid时,此视图不允许使用“”
本文关键字:DataGrid 视图 不允许 编辑 版本 项目 WPF 绑定 | 更新日期: 2023-09-27 18:30:00
我已经读了至少4个小时了,似乎是列表类型,但我遇到了一种情况:
具有集合属性的ObservableCollection。
我定义了第一个DataGrid,在部分
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<!-- second Datagrid here, binding to Level2 property of my Observable collection -->
</DataTemplate>
<DataGrid.RowDetailsTemplate>
一切都很好,屏幕上的一切都如我所料。。。但是:
- 如果尝试修改DataGrid1单元格,它允许我
- 如果尝试修改DataGrid2单元格,则会引发此异常
'EditItem' is not allowed for this view
我错过了什么?
这是我的型号:
public partial class Level1
{
public Level1()
{
this.Level2 = new HashSet<Level2>();
}
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代码:
<DataGrid Grid.Row="1"
ItemsSource="{Binding Level1}"
AutoGenerateColumns="False"
SelectionMode="Single"
GridLinesVisibility="Vertical"
CanUserAddRows="True"
CanUserDeleteRows="True"
x:Name="GridTipoAsociado">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Tipo de asociado" x:Name="TipoUsuarioSeleccionado">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Style="{StaticResource ResourceKey=FontElemNivel1}" Content="{Binding StrDescripcionTipoAsociado}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Style="{StaticResource ResourceKey=FontElemNivel2}" Text="{Binding StrDescripcionTipoAsociado }"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid Grid.Row="1"
ItemsSource="{Binding Level2}"
AutoGenerateColumns="False"
SelectionMode="Single"
SelectionUnit="Cell"
GridLinesVisibility="Vertical"
CanUserAddRows="True"
CanUserDeleteRows="True"
x:Name="GridItems">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Id Item">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding NumIdConcepto}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Items">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Level3.StrDescripcionConcepto}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Level3.StrDescripcionConcepto}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
我试过了,问题是您已经将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,我认为这里可能发生的情况是,这个不可编辑的Border不是TextBox或其他可编辑元素作为预期的源,而是通过进行编辑,这导致了一个隐藏在"EditItem is not allowed"异常中的异常。取消此RoutedEvent之前,它可以冒泡通过其无效的OriginalSource停止错误发生在其轨道上。
Tks给@nit谁给了我正确的路径。当然,问题在于EF集合的基本类型
Hashet<T>数据网格至少需要一个列表<T>,将我所有的类更改为"实体框架生成的类",给我带来了另一个问题,必须手动进行更改,我有很多这样的更改。
我的解决方案是创建一个转换器,这对我来说是肮脏的工作:
public class listToObservableCollection : BaseConverter, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
HashSet<Level2> observableList = (HashSet<Level2>)value;
return new ObservableCollection<Level2>(observableList);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (HashSet<Level2>)value;
}
}
public abstract class BaseConverter : MarkupExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
把它放在我的Datagrid2:的绑定上
<!--part of my window definition--!>
xmlns:l="clr-namespace:Recursos;assembly=Recursos"
...
<!--part of my resources section--!>
<l:listToObservableCollection x:Key="listoToObservable"/>
...
<!--part of my datagrid definition--!>
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);
}
}
以较短的方式编写:
DataGrid.BeginningEdit += (s, ss) => ss.Cancel = true;
您可以设置IsReadOnly属性。也许没有发生异常。。。请在xaml文件中尝试。。
IsReadOnly="True"
Seeing没有人发布过这一消息,答案是因为您绑定的集合需要实现IList
(可能还有ICollection
)。
这是由于DataGrid
(以及我认为的CollectionView
)的非通用性(想想object
)。
我解决了这个问题,将我的数据网格置于只读模式
<DataGrid
Name="dtgBulkInsert"
CanUserSortColumns="True"
Height="300" Visibility="Collapsed" IsReadOnly="True">