我们有一个包含多个列表框和组合框的Silverlight应用程序,这些列表框和组合框显示的数据排序不正确,我需要解决这个问题。它们的大多数ItemSource属性都是通过XAML设置的。它们的DataContext不能直接在控件上设置,而是在父级上设置。因此,我不能轻易地在后面的代码中将"OrderBy“赋值给ItemSource或DataContext赋值,因为该赋值可能并不显式存在。
所以我有了创建一个“代理”集合的想法。代理集合将获取原始ItemSource并公开排序后的版本。然后我就可以将这个转换为:
<ListBox ItemsSource="{Binding}"/>如下所示:
<ListBox>
<ListBox.ItemsSource>
<my:ProxyCollection Source="{Binding}" SortBy="Name"/>
</ListBox.ItemsSource>
</ListBox>不是太寒酸!但是,由于ProxyCollection不是ListBox的子类,列表框的DataContext不会传播给它,绑定也不会神奇地工作。如果我手动设置ProxyCollection集合的DataContext,效果会很好。但是,如果我无论如何都要手动设置DataContext,我也可以删除代理集合,手动设置列表框的DataContext,添加一个"OrderBy“。
关于如何在proxy集合上自动设置列表框的DataContext,您有什么想法吗?或者其他的天才点子?
发布于 2009-07-29 11:47:52
我偶然遇到了一个非常类似的问题。我想将参数从一个组合框级联到后续的组合框中,设计目标相同,不需要代码...
我的解决方案很难说是优雅的,但它的效果很好:)
基本上我有一个SharedDataContext控件,它有一个直接绑定到datacontext的“值”DP。
然后,我使用共享数据上下文上的附加属性来允许注册其他元素。
这使得XAML看起来像这样
<my:SharedDataContext Value="{Binding}" />
<ComboBox>
<ComboBox.ItemsSource>
<my:ProxyCollection my:SharedDataContext.Register="1" />
</ComboBox.ItemsSource>
</ComboBox>在SharedDataContext中,我有一个静态的框架元素集合。
当注册附加属性被“更改”时,我捕获PropertyChangedCallback并将发送方(在本例中为ProxyCollection实例)添加到集合中。
当数据绑定发生变化(以及SharedDataContext的Value属性)时,我枚举整个集合并设置数据绑定。
这是一项正在进行中的工作,我对它还不是百分之百满意(像清理收藏这样的事情我有点担心),但我希望它能给你一些想法。
HTH
西蒙
发布于 2009-07-15 20:56:36
鉴于数据上下文是在父级设置的,如果列表框绑定到设置为数据上下文的类的属性,则该属性将公开为get / set,并且您可以有意地以排序的方式从该属性输出数据。
这并不理想,因为在MVVM类型的场景中,这将规定排序顺序以非常视图消费VM。
发布于 2009-07-29 15:43:49
我最终从不同的途径解决了我的问题。例如,我创建了一个从标准ComboBox派生的"SortedComboBox“控件。它定义了自己的ItemSource,当它的ItemsSource改变时,它对项目进行排序,然后在基类上设置ItemsSource。它工作得足够好,只需对XAML进行少量更改即可获得所需的效果
https://stackoverflow.com/questions/1133960
复制相似问题