1. 程式人生 > >WPF: ListBox繫結xml資料

WPF: ListBox繫結xml資料

    繼承自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>
整體執行效果: