Problémy & Řešení – Binding to Specific Index

Problém

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

Řešení

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

Ohodnoťte článek: starstarstarstarstar

Komentáře

[ 5.2.2011 11:14:34 ]

Mne to nefunguje... :-(

[ 15.2.2011 22:31:29 ]

A co konkrétně nefunguje ?

Přidat komentář

jméno

text komentáře

opište text z obrázku


O autorovi

Lukáš Kubis

Lukáš Kubis

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!

web: http://web.lukaskubis.net

blog: http://lukaskubis.net

©2010 | David Beinhauer | Lukáš Kubis