【发布时间】:2012-04-14 15:47:10
【问题描述】:
我在 WPF 应用程序中有一个 DataGrid,它的 ItemsSource 有一个我编写的自定义集合。集合强制其所有项目满足特定要求(即它们必须介于某些最小值和最大值之间)。
集合的类签名是:
public class CheckedObservableCollection<T> : IList<T>, ICollection<T>, IList, ICollection,
INotifyCollectionChanged
where T : IComparable<T>, IEditableObject, ICloneable, INotifyPropertyChanged
我希望能够使用DataGrid 功能,在该功能中,对DataGrid 的最后一行进行编辑会导致在ItemsSource 的末尾添加一个新项目。
不幸的是,DataGrid 只是添加了一个使用默认构造函数创建的新项目。因此,在添加新项目时,DataGrid 间接(通过其 ItemCollection 这是一个密封类)声明:
ItemsSource.Add(new T())
其中 T 是 CheckedObservableCollection 中元素的类型。我希望网格改为添加一个不同的 T,它满足对集合施加的约束。
我的问题是:有内置的方法可以做到这一点吗?有人已经这样做了吗?最好的(最简单、最快速的编码;性能不是问题)方法是什么?
目前我只是派生DataGrid 来用我自己的覆盖OnExecutedBeginEdit 函数,如下所示:
public class CheckedDataGrid<T> : DataGrid where T : IEditableObject, IComparable<T>, INotifyPropertyChanged, ICloneable
{
public CheckedDataGrid() : base() { }
private IEditableCollectionView EditableItems {
get { return (IEditableCollectionView)Items; }
}
protected override void OnExecutedBeginEdit(ExecutedRoutedEventArgs e) {
try {
base.OnExecutedBeginEdit(e);
} catch (ArgumentException) {
var source = ItemsSource as CheckedObservableCollection<T>;
source.Add((T)source.MinValue.Clone());
this.Focus();
}
}
}
其中MinValue 是集合中允许的最小项目。
我不喜欢这个解决方案。如果你们有任何建议,我将非常感激!
谢谢
【问题讨论】:
-
在这里查看我的答案stackoverflow.com/questions/4484256/…。您可能可以使用 BindingList
. 做您需要的事情
标签: wpf datagrid datacontract itemssource type-constraints