【发布时间】:2014-04-22 18:10:18
【问题描述】:
我正在为 WP8.1 创建一个新的通用应用程序,但在使用 Hub 控件内的 ListView 时遇到了一些困难。
此 ListView 绑定到聊天消息的 ObservableCollection,并且此 ObservableCollection 会定期使用新消息进行更新。每次更新时,我都会滚动到 ListView 的底部。现在,我通过以下方式完成此操作:
this.vm.Messages.Add(new Message() { Body="Test Message", MateName="Test User", SendTime=DateTimeOffset.UtcNow });
list_messages.ScrollIntoView(this.vm.Messages.Last());
list_messages 是 ListView,其中 ItemsSource 绑定到 this.vm.Messages。
用图片展示什么结果有点困难;列表滚动到底部,但所有项目再次淡入,就像整个列表正在刷新一样。
当一个新项目被添加到列表的末尾时,这是一个进展:
如果只是 /last/ 项目消失了,那就太好了……但整个列表似乎都在刷新。这里可能出了什么问题?
这里是基本 XAML 的简要说明。
<ListView
x:Uid="list_messages"
x:Name="list_messages"
Margin="12,-12,6,0"
ItemsSource="{Binding}"
HorizontalContentAlignment="Stretch" Loaded="list_messages_Loaded">
...
<ListView.ItemTemplate>
<DataTemplate>
<ListViewItem> Textblock w/ bindings, etc. </ListViewItem>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
【问题讨论】:
-
某些东西可能会引发 Messages 属性的 OnPropertyChanged 事件。在属性上设置断点,看看添加消息时是否断点。
-
确实如此,我发现在调用此方法时会重新绘制整个项目。我的数据模板中有一个自定义内容展示器,当调用 ScrollIntoView(items.Last()) 时,所有内容展示器的构造函数都会被再次调用。我建议您创建一个自定义列表视图,在其中检索滚动查看器,因此您可以滚动到垂直偏移,您的问题就解决了。
标签: c# listview windows-runtime winrt-xaml windows-phone-8.1