关闭

WPF: ListBox绑定xml数据

352人阅读 评论(0) 收藏 举报
分类:

    继承自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个绑定属性:

  1. DisplayMemberPath  用来设置显示的对象属性路径。 
  2. SelectedValuePath    用来设置选择值的对象属性路径。 
上边2属性的绑定方式为 @加对应的节点属性名称,这里指的是SubName与SubId。 ListBox定义如下:
      <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。
  •      显示 选择的文本及值
ListBox的SelectedItem属性表示选择项对象,SelectedValue 属性表示选择项的值。 
<UniformGrid Columns="2" Margin="2">
<TextBlock Text="{Binding SelectedItem.Attributes[SubName].Value,ElementName=lbxml,StringFormat='显示的SubName:{0}'}"></TextBlock>
<TextBlock Text="{Binding SelectedValue,ElementName=lbxml,StringFormat='选择的SubId:{0}'}"></TextBlock>
</UniformGrid>
整体运行效果:


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:103106次
    • 积分:1375
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:0篇
    • 译文:1篇
    • 评论:23条
    文章分类
    最新评论