你可以使用ItemTemplate属性给控件({StaticResource RSSTemplate})应用一个模板。最后,当列表框控件中选择的项发生改变的时候,会调用TitleChanged事件(它是在SelectionChanged属性中指定的):
<StackPanel>
<TextBlock DockPanel.Dock="Left"
FontSize="18"
FontWeight="Bold" Margin="10"
HorizontalAlignment="Left">
Titles
</TextBlock>
<ListBox HorizontalAlignment="Left"
Margin="10,0,10,10"
Width="300"
Background="LightYellow"
ItemsSource="{Binding Source={StaticResource RSSData}, XPath=item}"
ItemTemplate="{StaticResource RSSTemplate}"
SelectionChanged="TitleChanged" />
</StackPanel>
当我们选中列表框控件中的数据项的时候,应用程序在页面右边显式该数据项的描述信息。在下一步中,你希望显示标题("Description"),它后面紧跟着<DockPanel>元素,这个元素又包含了一个绑定到描述元素({Binding XPath=description})的<TextBlock>元素。第二个<DockPanel>元素用于显示与选中数据项相关的URL({Binding XPath=link}),如图4所示:
<StackPanel>
<TextBlock DockPanel.Dock="Left"
FontSize="18"
FontWeight="Bold" Margin="10"
HorizontalAlignment="Left">
Description
</TextBlock>
<DockPanel HorizontalAlignment="Left" Name="dpDescription" Width="500">
<TextBlock Name="txtDescription"
DockPanel.Dock="Top"
FontSize="Small"
HorizontalAlignment="Left"
TextWrap="wrap"
Margin="10,0,10,10"
Background="Black"
Foreground="White"
TextContent="{Binding XPath=description}"
/>
</DockPanel>
<DockPanel HorizontalAlignment="Left"
Name="dpURL"
Width="500"
>
<TextBlock Name="txtURL"
DockPanel.Dock="Top"
FontSize="Small"
HorizontalAlignment="Left"
TextWrap="wrap"
TextContent="{Binding XPath=link}"
Margin="10,10,10,10"
Foreground="Blue"/>
</DockPanel>
</StackPanel>
</DockPanel>
</Page>

图4:显示具体描述信息。被选中的RSS项的描述信息和
链接被绑定到TextBlock控件。当用户在列表框中选择项目的时候它们会改变。
最后,你需要完善前面提到的TitleChanged()事件。在这个事件中,当用户选择列表框控件中的某个数据项的时候,你需要改变DataContext属性的dpDescription和dpURL <DockPanel>元素:
Partial Public Class Page1
Inherits Page
Private Sub TitleChanged(ByVal sender As Object, _
ByVal args As SelectionChangedEventArgs)
Dim lstbox As ListBox = sender
If lstbox.SelectedItem IsNot Nothing Then
dpDescription.DataContext = lstbox.SelectedItem
dpURL.DataContext = lstbox.SelectedItem
End If
End Sub
End Class
我们已经完成了!按F5测试应用程序。RSS XML文档中的数据项都显示在列表框控件中。你可以点击列表框控件中的数据项,相应的描述信息和URL就会显示在页面右侧(图1所示)。
绑定到外部的XML源
前面的例子演示了如何把XML数据岛绑定到WPF应用程序的多个控件上。在应用程序内使用XML数据岛引起的一个问题是,对XML数据的任何修改都要求修改/编译应用程序。更好的方法是把XML数据存储在外部文件中,在应用程序中引用该文件。例如,你可以把XML数据存储在RSS.xml文件中,接着可以在应用程序中引用它:
<XmlDataSource x:Key="RSSData" Source="RSS.xml" XPath="/rss/channel" />
动态地载入XML源
尽管你可以引用外部的XML文件,但是更好的办法可能是从URL动态地载入XML文档。在这个例子中,你可以修改<XmlDataSource>元素:
<XmlDataSource x:Key="RSSData" Source="http://services.devx.com/outgoing/devxfeed.xml" XPath="/rss/channel" />
你可以使用下面一些URL试一试,可以发现每次都载入了不同的RSS数据项:
· http://services.devx.com/outgoing/dotnet.xml
· http://services.devx.com/outgoing/wirelessfeed.xml
· http://services.devx.com/outgoing/enterprisefeed.xml
· http://services.devx.com/outgoing/xmlfeed.xml
进一步改善
在本文中你看到了在WPF中数据绑定是如何进行的。假如你希望进一步改善示例应用程序,可以考虑修改应用程序,答应用户从URL列表中选择一个(代替手动地修改XML文档源)。进入讨论组讨论。