星期五, 一月 05, 2007

如何同步两个绑定数据的ListBox的选择项?

如何同步两个绑定数据的ListBox的选择项?


原文出处:http://www.beacosta.com/Archive/2005_11_01_bcosta_archive.html 我将会向你展示两种方法来同步绑定数据的ListBox的选择项。

在第一种解决方案中,我将会创建数据集合的定制view,然后把两个ListBox都绑定到它上面。view能够跟踪它背后数据集合的当前项,允许我们排序,组合,过滤它的数据项。CollectionViewSource是九月CTP发布的一个新的类,能够用标识来创建一个定制的view。因为在这个例子中,创建的定制的view所跟踪数据集合的当前项,currency,选择项都是同步的,因此绑定两个ListBox到相同的view能够让他们的选择项同步。

    <Window.Resources>
        <local:GreekGods x:Key="source" />
        <CollectionViewSource Source="{StaticResource source}" x:Key="cvs"/>
    </Window.Resources>



    <ListBox ItemsSource="{Binding Source={StaticResource cvs}}" DisplayMemberPath="Name"/>
    <ListBox ItemsSource="{Binding Source={StaticResource cvs}}" DisplayMemberPath="Name"/>

我将会在以后的帖子中介绍如何使用CollectionViewSource来排序,分组,和过滤数据项。

另一个方法也能达到同样的效果,就是设置ItemsSource属性为数据源,同时设置IsSynchronizedWithCurrentItem属性为true:

    <ListBox ItemsSource="{StaticResource source}" IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Name"/>
    <ListBox ItemsSource="{StaticResource source}" IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Name"/>

这个markup有此功能是因为当绑定到一个集合时总是会创建一个view,如果你没有指定一个view,系统就会创建一个默认的view。虽然这个 view和定制的view用同样的方式跟踪数据,但如果你有默认的view,currency和选择项是默认不同步的。改变这个默认的行为的方法就是设置 IsSynchroizedWithCurrentItem属性为true

这些数据组通过定制的回馈来区分定制views和默认views之间的默认同步方式的不同之处。这种方法能让玩家了解到view的概念,且能够根据计自己的需要精确的指定哪些能够同步,哪些不能。

下面的图片中,第一和第二个ListBox是绑定到CollectionViewSource,第三第四个设置 InSynchronizedWithCurrentItem为true.

没有评论: