为了找到MvvmCross中缺少RelativeSource的遍历,我使用了Stuart的建议并实现了WrappingList MVVMCross changing ViewModel within a MvxBindableListView
但是,我看到这个跟踪它发生的每一个绑定,我想知道,它有多糟糕:
绑定到IEnumerable而不是IList - 这可能是低效的, 特别是对于大型名单
也许有其他建议吗?
public class WrappingCommandsList<T> : IList<WrappingCommandsList<T>.Wrapped>
{
private readonly List<T> _realList;
private readonly Action<T> _realActionOnClick;
public class Wrapped
{
public IMvxCommand ClickCommand { get; set; }
public T TheItem { get; set; }
}
public WrappingCommandsList(List<T> realList, Action<T> realActionOnClick)
{
_realList = realList;
_realActionOnClick = realActionOnClick;
}
private Wrapped Wrap(T item)
{
return new Wrapped()
{
ClickCommand = new MvxCommand(() => _realActionOnClick(item)),
TheItem = item
};
}
public WrappingCommandsList<T>.Wrapped this[int index]
{
get
{
return Wrap(_realList[index]);
}
set
{
throw new NotImplementedException();
}
}
public int Count
{
get { return _realList.Count; }
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<WrappingCommandsList<T>.Wrapped> GetEnumerator()
{
foreach (var item in _realList)
{
yield return Wrap(item);
}
}
答案 0 :(得分:2)
低效率取决于列表的长度以及使用滚动的距离。
例如,如果用户在屏幕上显示项目93,256,那么列表适配器找到项目93,256的唯一方法是获取枚举器并调用MoveNext 93,256次。
如果您的列表只有5个项目,则问题以5为限。
对于您的特定WrappingCommandsList
尝试实施IList
以及IList<T>
- 由于xamarin.ios AoT编译,mvx代码无法在运行时生成IList<T>
个访问者限制。