Postupy: Vytvoření vazby k kolekci a zobrazení informací na základě výběru
Ve scénáři master-detail máte například data vázaná na ItemsControl, například ListBox. Na základě výběru uživatele zobrazíte další informace o vybrané položce. Tento příklad ukazuje, jak tento scénář implementovat.
Příklad
V tomto příkladu je People
ObservableCollection<T> tříd Person
. Tato třída Person
obsahuje tři vlastnosti: FirstName
, LastName
a HomeTown
, všechny typy 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 používá následující DataTemplate definující způsob zobrazení informací 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>
Následuje snímek obrazovky, který ukazuje výstup příkladu. ContentControl zobrazí další vlastnosti vybrané osoby.
V tomto příkladu si můžete všimnout těchto dvou věcí:
ListBox a ContentControl se vážou ke stejnému zdroji. Path vlastnosti obou propojení nejsou zadány, protože oba ovládací prvky jsou připojeny na celý objekt kolekce.
Aby to fungovalo, musíte nastavit vlastnost IsSynchronizedWithCurrentItem na
true
. Nastavení této vlastnosti zajišťuje, že vybraná položka je vždy nastavena jako CurrentItem. Případně, pokud ListBox načte data z CollectionViewSource, synchronizuje automaticky výběr a měnu.
Všimněte si, že třída Person
přepíše metodu ToString
následujícím způsobem. Ve výchozím nastavení ListBox volá ToString
a zobrazí řetězcovou reprezentaci každého objektu v vázané kolekci. Proto se každý Person
objevuje jako křestní jméno v ListBox.
public override string ToString()
{
return firstname.ToString();
}
Public Overrides Function ToString() As String
Return Me._firstname.ToString
End Function
Viz také
.NET Desktop feedback