我们有一个带有多个列表框和组合框的Silverlight应用程序,它显示的数据排序不正确,我需要修复。他们的大多数ItemSource属性都是通过XAML设置的。他们的DataContext可能不是直接在控件上设置,而是在父控件上设置。所以我不能轻易地在后面的代码中对ItemSource或DataContext赋值使用“OrderBy”,因为该赋值可能不会明确存在。
所以我有了创建“代理”集合的想法。代理集合将获取原始ItemSource并公开已排序的版本。然后我就可以转换它了:
<ListBox ItemsSource="{Binding}"/>
进入这个:
<ListBox>
<ListBox.ItemsSource>
<my:ProxyCollection Source="{Binding}" SortBy="Name"/>
</ListBox.ItemsSource>
</ListBox>
不要太破旧!但是,由于ProxyCollection不是ListBox的子代,因此ListBox的DataContext不会传播给它,并且绑定不会神奇地起作用。如果我手动设置ProxyCollection集合的DataContext,它可以很好地工作。但是,如果我必须手动设置DataContext,我也可以删除代理集合并手动设置Listbox的DataContext,添加“OrderBy”。
那么关于如何在代理集合上自动获取ListBox的DataContext集的任何想法?还是其他任何天才的想法?
答案 0 :(得分:1)
我偶然发现了一个非常类似的问题。我想将一个组合框中的参数级联到一个后续的组合框中,其设计目标与无代码相同....
我的解决方案并不优雅,但它有点时尚:)
基本上我有一个SharedDataContext控件,它有一个“Value”DP我直接绑定到datacontext。
然后我在共享数据上下文中使用附加属性以允许注册其他元素。
这使得XAML看起来像这样
<my:SharedDataContext Value="{Binding}" />
<ComboBox>
<ComboBox.ItemsSource>
<my:ProxyCollection my:SharedDataContext.Register="1" />
</ComboBox.ItemsSource>
</ComboBox>
在SharedDataContext中,我有一个框架元素的静态集合。
当Register附加属性被“更改”时,我捕获PropertyChangedCallback并将发送者(在本例中为ProxyCollection实例)添加到集合中。
当数据绑定更改时(以及SharedDataContext的Value属性),我通过集合枚举并设置数据绑定。
这是一项正在进行中的工作,我对此并不是百分之百满意(清理收藏品之类的事情对我有些影响),但我希望它能为您提供一些想法。
HTH
西蒙
答案 1 :(得分:0)
如果在父级设置数据上下文,如果列表框绑定到被设置为数据上下文的类的属性 - 该属性将作为get / set公开,您可以故意输出数据从物业中分类出来。
不理想,因为在MVVM类型的场景中,它会规定排序顺序以便非常查看消耗VM。
答案 2 :(得分:0)
我最终从不同的路线解决了我的问题。例如,我创建了一个派生自标准ComboBox的“SortedComboBox”控件。它定义了自己的ItemSource,当它的ItemsSource改变时,它对项进行排序,然后在基类上设置ItemsSource。它运行良好,只需要进行一些XAML更改即可获得所需的效果
答案 3 :(得分:0)
您可以使用IValueConverter并将无序列表转换为有序列表。您可以使用converter参数指定订购方式。
它简单,干净,MVVM友好,您可以将它用于绑定到任何控件的任何集合:)