1

我们有一个 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

4 回答 4

1

我偶然发现了一个非常相似的问题。我想将参数从一个组合框级联到后续组合框,其设计目标相同,即无代码......

我的解决方案并不优雅,但它很流行:)

基本上我有一个 SharedDataContext 控件,它有一个我直接绑定到数据上下文的“值”DP。

然后,我在共享数据上下文中使用附加属性来允许注册其他元素。

这使得 XAML 看起来像这样

<my:SharedDataContext Value="{Binding}" />
<ComboBox>
    <ComboBox.ItemsSource>
       <my:ProxyCollection my:SharedDataContext.Register="1" />    
    </ComboBox.ItemsSource>
</ComboBox>

在 SharedDataContext 中,我有一个框架元素的静态集合。

当注册附加属性“更改”时,我捕获 PropertyChangedCallback 并将发送者(在本例中为 ProxyCollection 实例)添加到集合中。

当数据绑定发生变化(以及 SharedDataContext 的 Value 属性)时,我会枚举集合并设置数据绑定。

这是一项正在进行的工作,我对它还不是 100% 满意(清理收藏品之类的事情对我来说有点麻烦),但我希望它能给你一些想法。

高温高压

西蒙

于 2009-07-29T11:47:51.780 回答
0

鉴于数据上下文是在父级设置的,如果列表框绑定到被设置为数据上下文的类的属性 - 该属性将作为 get/set 公开,您可以故意从该属性输出数据以一种排序的方式。

不理想,在 MVVM 类型的场景中,这将决定排序顺序以非常查看正在使用的 VM。

于 2009-07-15T20:56:35.957 回答
0

您可以使用 IValueConverter 并将您的无序列表转换为有序列表。您可以使用转换器参数来指定如何订购。

它简单、干净、对 MVVM 友好,您可以将它用于绑定到任何控件的任何集合:)

于 2010-12-09T17:51:42.637 回答
0

我最终从不同的途径解决了我的问题。例如,我创建了一个从标准 ComboBox 派生的“SortedComboBox”控件。它定义了自己的 ItemSource,当它的 ItemsSource 发生变化时,它对项目进行排序,然后在基类上设置 ItemsSource。它工作得很好,只需要进行一些 XAML 更改即可获得所需的效果

于 2009-07-29T15:43:48.890 回答