在逻辑删除之后,在LongListSelector中恢复滚动位置

如何解决在逻辑删除之后,在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(我尝试过并且它起作用了),但是它是由比我聪明得多的人编写的,我想知道我是否不理解它。 有没有更好的办法?     

解决方法

        这是我最终想出的解决方案... 由于该工具包可免费获得源代码,因此我最终编辑了LongListSelector源代码以调用.Equals而不是==。对于我的用例来说,它似乎正常工作,我想我可以分享一下,以防其他人觉得它有用。 在LongListSelector.cs中找到GetFlattenedIndex(object item)函数并替换
if (item == _flattenedItems[index].Item)
if (item.Equals(_flattenedItems[index].Item))
然后在同一个文件中找到GetResolvedIndex(object item,out ContentPresenter contentPresenter)函数并替换
if (node.Value.Content == item)  // Nov 2010 Release
// OR
if (_flattenedItems[index].Item == item)  // Feb 2011 Release
if (item.Equals(node.Value.Content))  // Nov 2010 Release
// OR
if (item.Equals(_flattenedItems[index].Item))  // Feb 2011 Release
注意,替换取决于您所使用的工具包下载! 对控件进行这些更改后,即使引用不相等,只要您正确覆盖LongListSelector中显示的所有对象类型的Equals,它也将正确匹配ScrollTo(object)中指定的对象。如果您有分组列表,请不要忘记这适用于您的分组类以及项目类!     ,        您可以尝试在新列表中获取该商品吗?
var _goodReference = myList.FirstOrDefault(x => x.id == _lastItem.Id);

if (_goodReference != null)     
Dispatcher.BeginInvoke(() => { myLongList.ScrollTo(_goodReference); }); 
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?