Wprowadzenie do WPF cz. 2

Post on 12-Jan-2015

1.847 views 6 download

description

 

Transcript of Wprowadzenie do WPF cz. 2

Temat:

Seminarium Rzeszowskiej Grupy .NETProwadzący: Mateusz Pustelak

Wprowadzenie do WPF cz. 2

Agenda

1. Data Binding – co to takiego?

2. Pośrednia definicja kontrolek – co i jak?

3. Konwersja danych w WPF – IValueConverter.

Data Binding

co to takiego?

Klasycznie

Klasyczny model definiowania danych:dane = bazaDanych.PobierzDane();

Klasyczny model podpinania danych:JakasKontrolka.Text = dane.JakasWlasciwosc;

Data Binding

Obiekt docelowy

Właściwość 1

Właściwość 2

Obiekt źródłowy

Właściwość 1

Właściwość 2data binding

Obiekt źródłowy (Binding Source)

• Obiekty dowolnych klasnp. string, int, Person

• Właściwości dowolnych obiektównp. jakasOsoba.Surname

• Kolekcje obiektównp. Person[] tablicaOsob

• Dane XML, LINQ, ADO.NET, itd…• Inne kontrolki WPF

Obiekt docelowy (Binding Target)

• Każda właściwość każdej kontrolki WPFnp. Width, Height, Color, Background, Fontnp. TextBox, Label, Button, ListBox

Binding Mode

Obiekt docelowy

Właściwość

Obiekt źródłowy

Właściwość

OneWayToSourceTwoWayOneWayOneTime

Skąd pobrać dane?

• Ustawienie kontekstu kontrolkinaszaKontrolka.DataContext = naszaWlasciwosc;<Label Name="naszaKontrolka" Content="{Binding}"/>

• Ustawienie kontekstu kontrolki nadrzędnejnaszaKontrolka.DataContext = naszaWlasciwosc;<StackPanel Name="naszaKontrolka">

<Label Content="{Binding}"/></StackPanel>

Przykładpublic class Person{

private string _name;public string Name{…}private string _surname;public string Surname

{get { return _surname; }set

{_surname = value; }

public Person(string imie, string nazwisko){…}}

PrzykładKod języka XAML:<StackPanel Name="naszaKontrolka"

Orientation="Horizontal"><Label Content="{Binding Path=Name}"/><Label Content="{Binding Path=Surname}"/>

</StackPanel>

Bindowanie danych w kodzie:Person czlowiek = new Person("Mateusz", "Pustelak");naszaKontrolka.DataContext = czlowiek;

Automatyczna synchronizacja zmian

Po co?

Automatyczna synchronizacja zmianpublic class Person :INotifyPropertyChanged{

public event PropertyChangedEventHandler PropertyChanged;private string _name;public string Name{

get { return _name; }set{

_name = value;PropertyChanged(this, new PropertyChangedEventArgs("Name"));

}}

Pośrednia definicja kontrolek

Co i jak?

Data Template

Wyświetlanie obiektównp.: listy obiektów danej klasy

W dowolnej kontrolcenp.: ListView, ListBox, ComboBox

Przykład

private int _age;public int Age{

get { return _age; }set

{_age = value;PropertyChanged(this, new PropertyChangedEventArgs("Age"));}

}

Przykład<ListView Name="listaOsob">

<ListView.View><GridView>

<GridView.Columns><GridViewColumn Header="Wiek" Width="100">

<GridViewColumn.CellTemplate><DataTemplate>

<TextBlock Background="Azure" Text="{Binding Path=Age}"/>

</DataTemplate></GridViewColumn.CellTemplate>

</GridViewColumn>…

</GridView.Columns></GridView>

</ListView.View></ListView>

PrzykładObservableCollection<Person> listaLudzi = new

ObservableCollection<Person>();listaLudzi.Add(new Person("Mateusz", "Pustelak",

23));listaLudzi.Add(new Person("Jan", "Kowalski", 75));listaLudzi.Add(new Person("Tomasz", "Szostak", 22));listaLudzi.Add(new Person("Mała", "Mi", 12));listaOsob.ItemsSource = listaLudzi;

Konwersja danych w XAML

IValueConverter

Po co ?

IValueConverter

Czasami mamy dane w jednej postacinp.: string, int, bool

A chcemy je wyświetlić w innej

Przykład - IValueConverter[ValueConversion(typeof(int),typeof(string))]class AgeConverter : IValueConverter{

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

{if (value is int){

int wiek = (int)value;if (wiek < 18) return "Młody";else if (wiek >= 18 && wiek < 65) return "Średni";else if (wiek >= 65) return "Starszy";

}return null;

}public object ConvertBack(…){…}

}

Przykład - IValueConverterxmlns:local="clr-namespace:Test"

<Window.Resources><local:AgeConverter x:Key="KonwerterWieku"></local:AgeConverter>

</Window.Resources>

<GridViewColumn Header="Grupa wiekowa" DisplayMemberBinding="{Binding Path=Age, Converter={StaticResource KonwerterWieku}, Mode=OneWay}">

PYTANIA ?

Materiały i projekty zawarte w prezentacji zostaną udostępnione na stronie kod.prz.edu.pl

Kontakt:Mateusz Pustelak,email: mpustelak@mpustelak.plstrona: www.mpustelak.plgg: 4693252