如何从数据绑定的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
没有评论:
发表评论