星期一, 十二月 25, 2006

如何绑定ComboBox的Items?如何从绑定的ComboBox中获取ComboBoxItem?

如何绑定ComboBox的Items?如何从绑定的ComboBox中获取ComboBoxItem?


原文出处:http://www.beacosta.com/Archive/2005_09_01_bcosta_archive.html
绑定ComboBox的Items和绑定ListBox的Items是很象的:

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

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

<ComboBox ItemsSource="{StaticResource greekGods}" ItemTemplate="{StaticResource itemTemplate}" Width="200" Name="comboBox"/>

相似的原因是因为ComboBox和ListBox都是从ItemsControl继承来的,且ItemsSource和ItemTemplate都是ItemsControl的属性.

如果你读过前面关于如果从绑定数据的ListBox中获取一个ListBoxItem的帖子,你或许会认为没有必要继续阅读如何为ComboBox做同样的事.但是那里还是有一些小窍门你必须知道的. 

如果你使用与前面帖子相似的代码去解决问题,那就会发现ComboBoxItems是null:

GreekGod greekGod = (GreekGod)(comboBox.Items[0]);
ComboBoxItem cbi1 = (ComboBoxItem)(comboBox.ItemContainerGenerator.ContainerFromIndex(0));
ComboBoxItem cbi2 = (ComboBoxItem)(comboBox.ItemContainerGenerator.ContainerFromItem(comboBox.Items.CurrentItem));

这是因为ComboBox只会在你打开它时才会有产生的items.所以这个窍门就是当你调用ContainerFromIndex或ContainerFromItem前打开ComboBox:

GreekGod greekGod = (GreekGod)(comboBox.Items[0]);
comboBox.IsDropDownOpen = true;
ComboBoxItem cbi1 = (ComboBoxItem)(comboBox.ItemContainerGenerator.ContainerFromIndex(0));
ComboBoxItem cbi2 = (ComboBoxItem)(comboBox.ItemContainerGenerator.ContainerFromItem(comboBox.Items.CurrentItem));
comboBox.IsDropDownOpen = false;


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

share your files at box.net

没有评论: