在逻辑删除之后,在LongListSelector中恢复滚动位置
|
我正在尝试使用WP7 Silverlight工具包中的LongListSelector控件。它已经花了一些时间,但是我终于可以在我的应用程序中使用它了。不幸的是,我在正确处理逻辑删除过程中遇到了一些麻烦。
当应用程序成为逻辑删除(或用户通过选择列表中的一个项目导航到另一个页面)时,我将列表中最可见的项目的副本保存下来。我将其保存到类变量和应用程序状态集合中。
ICollection<object> visibleItems = myLongList.GetItemsInView();
_lastItem = null;
if (visibleItems.Count > 0)
_lastItem = visibleItems.First();
IDictionary<string, object> state =
Microsoft.Phone.Shell.PhoneApplicationService.Current.State;
state[\"IndexByName_LastTopItem\"] = _lastItem;
然后,当用户返回页面时,我检查两个值(状态或变量)之一,并使用它恢复上一个滚动位置。
if (_lastItem == null)
{
if (state.ContainsKey(\"IndexByName_LastTopItem\"))
{
_lastItem = state[\"IndexByName_LastTopItem\"] as Chemical;
}
}
if (_lastItem != null)
Dispatcher.BeginInvoke(() => { myLongList.ScrollTo(_lastItem); });
除非应用程序逻辑删除,否则此方法效果很好。在那种情况下,我没有收到任何错误,但是在我触摸并拖动之前,该列表完全空白。一旦执行此操作,它将重新显示在列表顶部。我查看了控件的源代码,发现当您调用.ScrollTo(object)时,它没有匹配项。进一步的调查发现,在搜索要滚动到的项目时,它使用==而不是等于进行比较。我仅覆盖Equals,并且显然默认==比较(按设计)引用。在逻辑删除后恢复状态项时,引用不匹配。
我可以覆盖==,但这感觉不对。我可以更改并重建控制源来改为调用equals(我尝试过并且它起作用了),但是它是由比我聪明得多的人编写的,我想知道我是否不理解它。
有没有更好的办法?
没有找到相关结果
已邀请:
2 个回复
杭难插
与
然后在同一个文件中找到GetResolvedIndex(object item,out ContentPresenter contentPresenter)函数并替换
与
注意,替换取决于您所使用的工具包下载! 对控件进行这些更改后,即使引用不相等,只要您正确覆盖LongListSelector中显示的所有对象类型的Equals,它也将正确匹配ScrollTo(object)中指定的对象。如果您有分组列表,请不要忘记这适用于您的分组类以及项目类!
奥李