继承自IEnumerable接口的各种集合都可以作为ListBox控件的数据源。WPF中的XmlDataProvider 提供了一种将xml文件作为集合数据源的便捷方式,只要所定义的xml格式正确没有拼写错误,XPath路径指定正确都可以绑定成功。 下面定义一个xml资源:
- 定义资源并应用到ListBox
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="800" Height="500" WindowStartupLocation="CenterScreen" Title="ListBox-绑定xml" SizeToContent="WidthAndHeight"> <Window.Resources> <XmlDataProvider x:Key="MyXmlData" XPath="Root/Sub"> <x:XData> <Root xmlns="" Name="Supermarket"> <Sub SubId="0" SubName="Sub0"/> <Sub SubId="1" SubName="Sub1"/> <Sub SubId="2" SubName="Sub2"/> <Sub SubId="3" SubName="Sub3"/> <Sub SubId="4" SubName="Sub4"/> <Sub SubId="5" SubName="Sub5"/> </Root> </x:XData> </XmlDataProvider> </Window.Resources>
注意这里的XPath只定义到二级的Sub,如果有多级向后追加即可。定义ListBox之前,首先介绍2个绑定属性:
上边2属性的绑定方式为 @加对应的节点属性名称,这里指的是SubName与SubId。 ListBox定义如下:
@H_301_17@
<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代替。效果: @H_301_17@
@H_301_17@
列表中显示的就是DisplayMemberPath 定义的SubName。
@H_301_17@
- 显示 选择的文本及值
ListBox的SelectedItem属性表示选择项对象,SelectedValue 属性表示选择项的值。
@H_301_17@
@H_301_17@
<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>整体运行效果: @H_301_17@
@H_301_17@ 原文链接:https://www.f2er.com/xml/294239.html