我有一个silverlight 3.0项目,它有一个数据绑定到项目列表的列表框。我想要做的是将列表框中显示的项目数量限制为< = 10.我最初是通过对我的orignal数据执行a .Take(10)来限制绑定到列表的数据到10个项目。数据绑定结果。
.Take(10)方法的问题是原始数据源可能会发生变化,因为.Take()返回原始数据的引用(或不确定)我有时看不到反映数据的变化在我的用户界面。
我正试图找出一种更好的方法来处理这个而不是.Take()方法。如果您有多个UI元素绑定到相同的数据,似乎您不应该使用LINQ函数“过滤”您的数据。关于如何做得更好的唯一想法是制作一个限制计数的自定义容器,但这似乎是制作自定义堆栈面板或同等工作的一大堆工作。
答案 0 :(得分:0)
Take(10)
不会复制,它只是向LINQ查询添加了另一个步骤。但所有执行仍然推迟到有人提取查询的项目。
如果您静态设置项目,则确实会通过运行一次查询来创建副本。但是,由于您将构造的查询设置为列表框的ItemsSource
属性,因此它可以随时运行和更新,因此这是正确的方法。
您有时看不到UI中反映的数据更改的真正原因是列表框无法确定查询返回的数据发生更改的原因,并且肯定不希望继续尝试重新获取数据并可能自行更新。你需要让它知道。
你怎么能让它知道? ItemsSource
的文档说“您应该将ItemsSource
设置为实现INotifyCollectionChanged
接口的对象,以便反映集合中的更改(...)。 ”。显然,.Net本身的默认处理方式在您的情况下不起作用。
所以有一些例子如何自己实现,例如在this SO answer。如果即使是顶级源数据集(您正在进行LINQ查询)也不支持这些通知(您只是转发),您可能需要从其他代码手动更新列表框,这会更改基础数据