Как привязать к коллекции и отображать информацию на основе выбора
В простом сценарии с главной детализацией у вас есть привязанные к данным ItemsControl, такие как ListBox. На основе выбора пользователя вы отображаете дополнительные сведения о выбранном элементе. В этом примере показано, как реализовать этот сценарий.
Пример
В этом примере People
— это ObservableCollection<T> классов Person
. Класс Person
содержит три свойства: FirstName
, LastName
и HomeTown
, все типа string
.
<Window x:Class="SDKSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://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 override string ToString()
{
return firstname.ToString();
}
Public Overrides Function ToString() As String
Return Me._firstname.ToString
End Function
См. также
.NET Desktop feedback