星期六, 十二月 23, 2006

如何从数据绑定的ListBox中获取ListBoxItem?

如何从数据绑定的ListBox中获取ListBoxItem?

原文出处:http://www.beacosta.com/Archive/2005_09_01_bcosta_archive.html

在WPF中数据绑定一个ListBox到一个列举物品并不是那么容易.

<Window.Resources>
    <local:GreekGods x:Key="greekGods"/>

    <DataTemplate x:Key="itemTemplate">
        <TextBlock Text="{Binding Path=Name}" />
    </DataTemplate>
</Window.Resources>

<ListBox ItemsSource="{StaticResource greekGods}" ItemTemplate="{StaticResource itemTemplate}" Name="listBox"/>

ListBox的ItemSource属性有一个IEnumerable,就是你想要显示的物体列表.在这里GreekGods数据源是ObservableCollection(继承自IEnumerable)类型.ItemTemplate属性指定DataTemplate,DataTemplate是用来控制如何显示数据的.在这个例子中,每一项都有一个TextBlock来显示GreekGod的名字.

一些人可能会很惊讶,因为运行代码中的ListBox.Items[i]会返回我们所绑定的数据而不是TextBlock或者ListBoxItem.我觉得,能够 很容易的从ListBox中获取到特定位置的数据是很酷的,因为这是我们通常想要的.

GreekGod greekGod = (GreekGod)(listBox.Items[0]);

但是当你确实想获取产生的ListBoxItem时该如何做呢?这个有一些小窍门去发掘,但是利用下面的代码也很容易做到:

ListBoxItem lbi1 = (ListBoxItem)(listBox.ItemContainerGenerator.ContainerFromIndex(0));

另外ListBox.ItemContainerGenerator.ContainerFromItem(object item)通过指定item也能返回ListBoxItem.这个方法很经常使用到,例如,从CurrentItem获取ListBoxItem:

ListBoxItem lbi2 = (ListBoxItem)(listBox.ItemContainerGenerator.ContainerFromIndex(listBox.Items.CurrentItem));

我将会在以后的帖子中详细的介绍selection和current item.但在这个例子中,这个还是很有必要知道的,为了保持selection和current item的同步性,我设置了ListBox的IsSynchronizedWithCurrentItem="true".



由于原来作者的代码比较早期,vs更新后无法编译了.自己小小修改以下:

share your files at box.net

没有评论: