WPF: ListBox繫結xml資料
阿新 • • 發佈:2019-02-14
繼承自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個繫結屬性:
- DisplayMemberPath 用來設定顯示的物件屬性路徑。
- SelectedValuePath 用來設定選擇值的物件屬性路徑。
ContentPresenter 用來預設顯示內容,也可使用其它內容控制元件Textblock代替。效果: 列表中顯示的就是 DisplayMemberPath 定義的SubName。<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>
- 顯示 選擇的文字及值
整體執行效果:<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>