【问题标题】:Binding ItemsSource to a "proxy" collection. How to get DataContext?将 ItemsSource 绑定到“代理”集合。如何获取数据上下文?
【发布时间】:2009-07-15 20:49:39
【问题描述】:

我们有一个 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 集有什么想法吗?还是有其他天才的想法?

【问题讨论】:

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


    【解决方案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% 满意(清理收藏之类的事情让我有点担心),但我希望它能给你一些想法。

    HTH

    西蒙

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-04-11
            • 2012-12-10
            • 2014-06-07
            • 2010-12-10
            • 2013-01-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多