wtorek, 18 grudnia 2012

70-511 Rozdział 7 - Binding - bindowanie do różnych typów

Bindować można się do wielu różnych źródeł danych: obiektów, list obiektów, obiektów ADO.NET, XML-a itd.

Listy
Bindować się do list można na dwa sposoby:
  • tak aby zobaczyć wszystkie dostępne obiekty na raz np. w kontrolce ListBox
  • stworzenie nawigacji na formatkach szczegółów - na raz widzimy opis tylko jednego elementu i dostarczamy interfejs aby użytkownik mógł przechodzić do kolejnych elementów listy
Kontrolki, które umożliwiają wyświetlenie całej listy obiektów na raz posiadają właściwości ułatwiające bindowanie i operacje na bindowanych danych:
  • ItemsSource - źródło danych
  • ItemTemplate - szablon wyświetlania danych
  • DisplayMemberPath - właściwość która będzie użyta jako tekst wyświetlany, dla pojedynczego elementu w kontrolce
  • IsSynchronizedWithCurrentItem - czy element wybrany jest tym samym elementem, który jest oznaczony jako wybrany w liście
Możemy także zbindować listę do kontrolki typu Label, TextBlock. Zostanie wyświetlony wtedy tylko pierwszy element z listy, do kolejnych elementów możemy dorobić nawigację.
Przykład ilustrujący powyżej opisane metody bindowania:

Code:
    public partial class MainWindow : Window
    {
        public PersonList PersonList { get; set; }

        public MainWindow()
        {
            PersonList = new PersonList();
            DataContext = PersonList;
            InitializeComponent();
        }
    }

    public class PersonList : ObservableCollection<Person>
    {
        public PersonList()
        {
            Add(new Person {FirstName = "Jacek", LastName = "Kowalski"});
            Add(new Person {FirstName = "Marek", LastName = "Scigalski"});
            Add(new Person {FirstName = "Bartek", LastName = "Potocki"});
        }
    }

    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

Code:
<Window x:Class="EpfExample3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <ListBox ItemsSource="{Binding}" DisplayMemberPath="LastName" Height="100" Width="100"></ListBox>
        <TextBlock Text="{Binding FirstName}" Grid.Row="1" VerticalAlignment="Top" />
    </Grid>
</Window>

Efekt:



Nawigacja po liście
Po zbindowaniu kolekcji do kontrolki WPF tworzy automatycznie mechanizm do nawigowania po kolekcji. Za całość odpowiada interfejs ICollectionView, posiadający następujące składowe:
  • CurrentItem - zwraca obecny element
  • CurrentPosition - zwraca aktualny indeks
  • IsCurrentAfterLast - flaga mówiąca czy obecny element jest za ostatnim w kolekcji
  • IsCurrentBeforeFirst - flaga mówiąca czy obecny element jest przed pierwszym w kolekcji
  • MoveCurrentTo - zmienia referencję obecnego elementu na ten który podamy
  • MoveCurrentToFirst - zmienia referencję obecnego elementu na pierwszy w kolekcji
  • MoveCurrentToLast - zmienia referencję obecnego elementu na ostatni w kolekcji
  • MoveCurrentToNext - zmienia referencję obecnego elementu na kolejny w kolekcji
  • MoveCurrentToPosition - zmienia referencję obecnego elementu na element podany przez indeks
  • MoveCurrentToPrevious - zmienia referencję obecnego elementu na poprzedni w kolekcji
Pobrać referencje do interfejsu ICollectionView możemy przez metodę CollectionViewSource.GetDefaultView(). W zależności od typu kolekcji metoda GetDefaultView zwróci jedną z trzech klas:
  • jeżeli kolekcja implementuje interfejs IBindingList zostanie zwrócona referencja do klasy BindingListCollectionView
  • jeżeli kolekcja implementuje interfejs IList ale nie implementuje IBindingList - zostanie zwrócona instancja klasy ListCollectionView
  • jeżeli kolekcja implementuje IEnumerable, ale nie implementuje ani IBindingList, ani IList zostanie zwrócona instancja klasy
Aby skorzystać z którejś specyficznej klasy należy rzutować rezultatmetody GetDefaultView na odpowiedni typ.

Przykład aplikacji w której po liście obiektów można nawigować przy pomocy metod interfejsu ICollectionView udostępniłem tutaj: http://sdrv.ms/Si0Wz9
W aplikacji za pomocą komend możemy chodzić po liście obiektów pobranych z bazy AdventureWorks:


Brak komentarzy:

Prześlij komentarz