我创建SelectionHelper
了DataGrid
它允许在两个方向上绑定所选项目。
在此辅助手册中,我ScrollIntoView
在从ViewModel的选择更改时呼叫第一个选定的项目。通话成功返回。但是稍后在 UI 的消息队列中的某个地方发生了一些事情,并且调用了我的集合的 IndexOf。
由于 UI 虚拟化,我怀疑它是异步的。DataGrid
绝对是想知道项目的索引。但是我无法理解为什么它会放置ItemsControl.ItemInfo
而不是 item。
这是错误还是未记录的功能?
我的集合实现了这些接口:IList<T>
, IList
,INotifyCollectionChanged
这是代码IndexOf
:
public int IndexOf(object value)
{
if ((value != null && !(value is T))
|| (value == null && typeof(T).IsValueType))
throw new ArgumentException(WrongTypeMessage, "value");
return IndexOf((T)value);
}
它按预期抛出异常=)
更新
是的,我的猜测是正确的。这是 DataGrid 的代码ScrollIntoView
public void ScrollIntoView(object item)
{
if (item == null)
throw new ArgumentNullException("item");
this.ScrollIntoView(this.NewItemInfo(item, (DependencyObject) null, -1));
}
internal void ScrollIntoView(ItemsControl.ItemInfo info)
{
if (this.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
this.OnBringItemIntoView(info);
else
this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, (Delegate) new DispatcherOperationCallback(((ItemsControl) this).OnBringItemIntoView), (object) info);
}
更新 问题已在此更新中修复