我使用的是自定义ConfigurationElementCollection
Implements INotifyCollectionChanged
。可以存储在集合中的每个元素(所有元素都继承ConfigurationElement
),也是Implements INotifyPropertyChanged
。
我有一个配置处理程序类,它在调用构造函数时将集合存储在属性(CustomCollection
)中。此ConfigHandler
也Implements INotifyPropertyChanged
。
构造函数如下:
_config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
CustomCollection = (DirectCast(_config.GetSection("CustomCollection"), CustomConfigurationSection)).CustomCollection
我可以很好地绑定到CustomCollection:
<DataGrid DataContext="{Binding Source={x:Static l:Handlers.ConfigHandler}}" ItemsSource="{Binding Path=CustomCollection}" />
这会正确显示屏幕上的所有元素。
然而,只要我尝试编辑其中一个元素,我就会遇到异常:
System.InvalidOperationException: 'EditItem' is not allowed for this view.
at System.Windows.Controls.ItemCollection.System.ComponentModel.IEditableCollectionView.EditItem(Object item)
at System.Windows.Controls.DataGrid.EditRowItem(Object rowItem)
...
如何使此绑定可编辑?我能想到的唯一方法是制作一些更传统的类(即不是配置类)并将所有数据复制到那些 - 但是当我已经获得所有可观察的属性时,这似乎是浪费需要建立。
答案 0 :(得分:1)
您的收藏是IEnumerable<ConfigurationElement>
吗?无法在DataGrid中编辑枚举数。将其转换为List<ConfigurationElement>
ConfigurationElementCollection
似乎是IEnumerable
。来自msdn:
public abstract class ConfigurationElementCollection : ConfigurationElement,
ICollection, IEnumerable
你应该让你的班级成为List
:
CustomCollection = (from ConfigurationElement ce in someConfigurationElementCollection select ce).ToList();