将ItemsSource绑定到“代理”集合。如何获取DataContext?

时间:2009-07-15 20:49:40

标签: silverlight data-binding silverlight-2.0 datacontext itemssource

我们有一个带有多个列表框和组合框的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集的任何想法?还是其他任何天才的想法?

4 个答案:

答案 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友好,您可以将它用于绑定到任何控件的任何集合:)