(使用.Net版本4.0)我正在尝试为AttachedProperty
创建一个WPF DataGrids
。该属性将使用一种方法将网格ItemSource
中的项目从一个索引移动到另一个索引。它假定网格的源集合是ObservableCollection
,这对我来说是安全的。我的计划是将ItemSource
投射到ObservableCollection
,然后使用该集合的Move
方法。
但是...... ObservableCollection
是通用的,没有基类/接口,那么我将转换为? type参数与此方法无关,但也未知,因为它适用于任何DataGrid
。我可以一直到Ilist
,使用Remove
和Insert
,但这可能会不必要地引发我要避免的INotifyCollectionChanged
事件。
答案 0 :(得分:2)
由于ObservableCollection<T>.Move()
没有T
类型的任何参数,您可以咬住子弹并通过反射调用Move()
。我称之为kludge,其他人可能会使用不适合Stack Overflow的单词,但以下编译,工作,并不关心T
的类型。
ObservableCollection<int> foo = new ObservableCollection<int>()
{
0, 1, 2, 3, 4
};
var method = foo.GetType()
.GetMethod("Move",
System.Reflection.BindingFlags.Instance
| System.Reflection.BindingFlags.Public);
// Not a bad idea to check here if method is null before calling it.
method.Invoke(foo, new object[] { 0, 2 });
你可能想要调用Type.GetMethods()
并使用LINQ搜索结果,这样你就可以防止你手上有一个子类的罕见情况,它会使用不同的参数重载Move()
。
但GetMethod()
和Invoke()
来电并不关心究竟是什么类型ObservableCollection
。并且您将获得您正在寻找的单个CollectionChanged
事件。