如何:绑定到集合并基于选择显示信息
更新:2007 年 11 月
在一个简单的主-从方案中,您有一个已绑定数据的 ItemsControl,例如 ListBox。基于用户的选择显示有关选定项的更多信息。此示例演示如何实现该方案。
示例
在此示例中,People 是 Person 类的一个 ObservableCollection<T>。该 Person 类包含三个属性:FirstName、LastName 和 HomeTown,它们的类型均为 string。
<Window x:Class="SDKSample.Window1"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SDKSample"
Title="Binding to a Collection"
SizeToContent="WidthAndHeight">
<Window.Resources>
<local:People x:Key="MyFriends"/>
...
</Window.Resources>
<StackPanel>
<TextBlock FontFamily="Verdana" FontSize="11"
Margin="5,15,0,10" FontWeight="Bold">My Friends:</TextBlock>
<ListBox Width="200" IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Source={StaticResource MyFriends}}"/>
<TextBlock FontFamily="Verdana" FontSize="11"
Margin="5,15,0,5" FontWeight="Bold">Information:</TextBlock>
<ContentControl Content="{Binding Source={StaticResource MyFriends}}"
ContentTemplate="{StaticResource DetailTemplate}"/>
</StackPanel>
</Window>
ContentControl 使用以下 DataTemplate,该模板定义如何显示 Person 的信息:
<DataTemplate x:Key="DetailTemplate">
<Border Width="300" Height="100" Margin="20"
BorderBrush="Aqua" BorderThickness="1" Padding="8">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="First Name:"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=FirstName}"/>
<TextBlock Grid.Row="1" Grid.Column="0" Text="Last Name:"/>
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=LastName}"/>
<TextBlock Grid.Row="2" Grid.Column="0" Text="Home Town:"/>
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=HomeTown}"/>
</Grid>
</Border>
</DataTemplate>
以下是该示例生成的内容的一个屏幕快照。ContentControl 显示所选人员的其他属性。
此示例中需要注意的两点是:
ListBox 和 ContentControl 绑定到同一个源。两个绑定的 Path 属性均未指定,因为两个控件都绑定到整个集合对象。
为此,必须将 IsSynchronizedWithCurrentItem 属性设置为 true。设置此属性可以确保选定项始终设置为 CurrentItem。或者,如果 ListBox 从 CollectionViewSource 获取数据,则它将自动同步选定内容和当前内容。
请注意,Person 类按以下方式重写 ToString 方法。默认情况下,ListBox 调用 ToString 并显示绑定集合中每个对象的字符串表示形式。因此,每个 Person 都显示为 ListBox 中的第一个名称。
Public Overrides Function ToString() As String
Return Me._firstname.ToString
End Function
public override string ToString()
{
return firstname.ToString();
}
有关完整示例,请参见 绑定到集合的示例。