Na internetu je plno ukázek jak nabindovat ObservableCollection<T>, ale téměř žádná jak si vzít např. první prvek, či jakýkoliv jiný prvek na zadaném indexu. Takhle nějak se ptala osoba X na msdn fóru
Nejdříve mně napadlo vytvořit novou vlastnost např. FirstItem, která by vracela první prvek z kolekce. Poté jsem si ovšem všimnul požadavku na vrácení prvku na zadaném indexu a proto je výhodnější použít klasický Binding pouze s upřesněním příslušného indexu. Syntaxe Bindingu na zadaný index může vypadat následovně:
{Binding Items[0]}
Pro ukázku ještě celá aplikace. Nejdříve testovací data (třída Person a kolekce People)
public class People : ObservableCollection<Person>
{
public People()
{
this.Add(new Person {Name = "Lukas"});
this.Add(new Person {Name = "Pepa"});
this.Add(new Person {Name = "David"});
}
}
public class Person
{
public string Name { get; set; }
}
UserControl PersonInfo, který zobrazuje pouze název osoby
<UserControl x:Class="BindingToSpecificIndexSample.PersonInfo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBlock Text="{Binding Name}"/>
</Grid>
</UserControl>
A hlavní okno, ve kterém si vytvoříme 3x PersonInfo, kde každý PersonInfo objekt se nabinduje v kolekci na příslušný index
<Window x:Class="BindingToSpecificIndexSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BindingToSpecificIndexSample"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:Person x:Key="p"/>
</Window.Resources>
<StackPanel>
<local:PersonInfo DataContext="{Binding Items[0]}"/>
<local:PersonInfo DataContext="{Binding Items[1]}"/>
<local:PersonInfo DataContext="{Binding Items[2]},"/>
</StackPanel>
</Window>
Na závěr ViewModel, který nastavím jako DataContext objektu Window
public class MainWindowViewModel
{
public People Items { get; private set; }
public MainWindowViewModel()
{
Items = new People();
}
}
V případě, že zadáme index mimo povolený rozsah, tak dojde k výjimce. Nejlépe to ošetříme na straně UserControlu PersonInfo, kde nastavíme FallbackValue na informativní text např. index je mimo povolený rozsah, N/A či něco podobného
Mne to nefunguje... :-(
A co konkrétně nefunguje ?
Působí jako Microsoft Student Partner na VŠB-TU Ostrava a zároveň pracuje jako software developer.
Mezi jeho portfolio patří platforma Microsoft .NET především WPF, WCF, Silverlight, ASP.NET MVC, ale i oblast týmového vývoje a Design Patterns.
Rovněž publikuje na MSTV.cz a je držitelem ocenění Microsoft Most Valuable Professional (MVP)
Máte-li zájem o školení, konzultaci či zakázkový vývoj pak mě neváhejte kontaktovat!
email: me(at)lukaskubis.net
web: http://web.lukaskubis.net
blog: http://lukaskubis.net