继承自IEnumerable接口的各种集合都可以作为ListBox控件的数据源。WPF中的XmlDataProvider 提供了一种将xml文件作为集合数据源的便捷方式,只要所定义的xml格式正确没有拼写错误,XPath路径指定正确都可以绑定成功。 下面定义一个xml资源:
- 定义资源并应用到ListBox
注意这里的XPath只定义到二级的Sub,如果有多级向后追加即可。定义ListBox之前,首先介绍2个绑定属性:
<ListBox Name="lbxml" Width="300" Height="300" SelectionMode="Single" DisplayMemberPath="@SubName" SelectedValuePath="@SubId" ItemsSource="{Binding Source={StaticResource MyXmlData}}"> <ListBox.ItemContainerStyle> <Style TargetType="{x:Type ListBoxItem}"> <Setter Property="Focusable" Value="True"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ListBoxItem}"> <Border x:Name="border" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="transparent"> <ContentPresenter SnapsToDevicePixels="True"></ContentPresenter> </Border> <ControlTemplate.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" TargetName="border" Value="#958679"></Setter> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ListBox.ItemContainerStyle> </ListBox>ContentPresenter 用来默认显示内容,也可使用其它内容控件Textblock代替。效果:
列表中显示的就是DisplayMemberPath 定义的SubName。
<UniformGrid Columns="2" Margin="2"> <TextBlock Text="{Binding SelectedItem.Attributes[SubName].Value,ElementName=lbxml,StringFormat='显示的SubName:{0}'}"></TextBlock> <TextBlock Text="{Binding SelectedValue,StringFormat='选择的SubId:{0}'}"></TextBlock> </UniformGrid>整体运行效果: