2009-10-19 41 views
1

我有一个silverlight 3.0项目,其中有一个列表框,它是一个列表框,用于将数据绑定到项目列表。我想要做的是将列表框中显示的项目数量限制为< = 10.我原本通过在绑定数据和数据绑定时对绑定到列表的数据进行限制,将其限制为10个项目。结果。 ()方法的问题是原始数据源可能会改变,并且自.Take()返回原始数据的引用(或复制不确定)我有时看不到数据中的更改反映在我的用户界面。自定义列表框:限制最大项目数

我想找出一个更好的方式来处理这个,而不是.Take()方法。如果你有多个UI元素绑定到相同的数据,你似乎不应该使用LINQ函数'过滤'你的数据。我唯一想到如何更好地做到这一点的方法是制作一个自定义容器,以限制计数,但似乎可能是制作自定义堆栈面板或同等设备的一大堆工作。

回答

0

Take(10)不会复制,它只是将另一个步骤附加到LINQ查询。但是,所有执行都会延迟到某个人拉出查询的项目。

如果您要静态设置项目,通过运行一次查询确实会创建一个副本。但是由于您将构建的查询设置为列表框的ItemsSource属性,因此它可以随时运行并更新它,因此它是正确的方法。

你有时看不到UI中反映的数据发生变化的真正原因是,列表框无法确定查询返回的数据为什么发生了变化,并且它肯定不希望保持不变试图重新获取数据并可能更新自己。你需要让它知道。

你怎么能让它知道? ItemsSource的文档说“”应该将ItemsSource设置为实现INotifyCollectionChanged接口的对象,以便集合中的更改将被反映(...)“。显然,.Net本身的缺省做法在你的情况下不起作用。

所以有一些例子说明如何自己实现在this SO answer。如果即使顶级源数据收集(您正在进行LINQ查询时)也不支持这些通知(您只需转发这些通知),则可能需要从其他代码手动更新列表框,以更改基础数据。