data binding in xamarin · xamarin.forms xam270. information in this document is subject to change...

61
Download class materials from university.xamarin.com Data Binding in Xamarin.Forms XAM270

Upload: others

Post on 02-Aug-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Download class materials from

university.xamarin.com

Data Binding in

Xamarin.Forms

XAM270

Page 2: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Information in this document is subject to change without notice. The example companies,

organizations, products, people, and events depicted herein are fictitious. No association with

any real company, organization, product, person or event is intended or should be inferred.

Complying with all applicable copyright laws is the responsibility of the user.

Microsoft or Xamarin may have patents, patent applications, trademarked, copyrights, or other

intellectual property rights covering subject matter in this document. Except as expressly

provided in any license agreement from Microsoft or Xamarin, the furnishing of this document

does not give you any license to these patents, trademarks, or other intellectual property.

© 2014-2017 Xamarin Inc., Microsoft. All rights reserved.

Xamarin, MonoTouch, MonoDroid, Xamarin.iOS, Xamarin.Android, Xamarin Studio, and Visual

Studio are either registered trademarks or trademarks of Microsoft in the U.S.A. and/or other

countries.

Other product and company names herein may be the trademarks of their respective owners.

Page 3: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

1. Use data binding to decouple

code-behind from UI

2. Use value converters to bind

incompatible types

Objectives

Page 4: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Use data binding to decouple

code-behind from UI

Page 5: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

1. Map data to visuals

2. Create bindings in code

3. Create bindings in XAML

4. Work with binding context

5. Change binding modes

6. Implement property change

notifications

Tasks

Page 6: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ Most applications display and manipulate data in

some form

▪ internally generated

▪ read from an external source

❖ Classes created to represent data are often referred

to as Models

▪ can also refer to "entity" objects

Apps are driven by data

Page 7: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ We use code to display internal data in our pages

❖ … and events to provide interactivity / behavior

Data > Views

Name.Text = task.Title;Notes.Text = task.Notes;IsDone.IsToggled = task.Completed;...

Name.TextChanged += (sender, e) => task.Title = Name.Text;

IsDone.Toggled += (sender, e) => task.Completed = IsDone.IsToggled;

Page 8: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ This approach works, and for small-ish applications is perfectly adequate

but it has disadvantages as the application grows in complexity

Data > Views in code

Updates to

data are not

centralized

Relationships in data

or UI behavior is

harder to manage

Hard to unit test UI is tightly coupled

to the code behind

logic, changes

ripple through code

Page 9: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ Data Binding involves creating a loose relationship between a source

property and a target property so that the source and target are

unaware of each other

Introducing: Data Binding

Binding acts as an intermediary – moving the data between the source and target

Source Target

Any Object

Any public property

BindableObject

BindablePropertyBinding

Page 10: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ Bindings require three pieces of information

Creating Bindings in Xamarin.Forms

Source Path Target

Can be any

accessible object

Public property

defined on the

source object

Must be a BindableProperty

Page 11: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Creating bindings [Source]

Todo task = new ToDo() { Title = "Pickup some Milk", ... };

Entry Name = new Entry();

Binding nameBinding = new Binding(); nameBinding.Source = task;

...

1

Binding identifies the source of the

binding data – this is where the data

comes from, in this case it's a single ToDo

object defined in our application

Page 12: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Creating bindings [Path]

Todo task = new ToDo() { Title = "Pickup some Milk", ... };

Entry Name = new Entry();

Binding nameBinding = new Binding(); nameBinding.Source = task;nameBinding.Path = "Title";

...

2

Binding identifies the property path which

identifies a property on the source to get the

data from, in this case we want to get the value

from the Todo.Title property

Page 13: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Creating bindings [Path]

Todo task = new ToDo() { Title = "Pickup some Milk", ... };

Entry Name = new Entry();

Binding nameBinding = new Binding(); nameBinding.Source = task;nameBinding.Path = "Title";

new Binding("Property")new Binding("Property.Child")new Binding("Property[Key]")new Binding("Property[1]")new Binding("[Key]")new Binding(".")

More Path Examples

Page 14: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Creating bindings [Target]

Todo task = new ToDo() { Title = "Pickup some Milk", ... };

Entry Name = new Entry();

Binding nameBinding = new Binding(); nameBinding.Source = task;nameBinding.Path = "Title";

Name.SetBinding(Entry.TextProperty, nameBinding);

Binding is associated to the target property using the

BindableObject.SetBinding method

3

Page 15: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Creating bindings [Target]

Todo task = new ToDo() { Title = "Pickup some Milk", ... };

Entry Name = new Entry();

Binding nameBinding = new Binding(); nameBinding.Source = task;nameBinding.Path = "Title";

Name.SetBinding(Entry.TextProperty, nameBinding);

This is passed the specific target property the binding

will work with – this must be a BindableProperty

3

Page 16: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Creating bindings [Target]

Todo task = new ToDo() { Title = "Pickup some Milk", ... };

Entry Name = new Entry();

Binding nameBinding = new Binding(); nameBinding.Source = task;nameBinding.Path = "Title";

Name.SetBinding(Entry.TextProperty, nameBinding);

… and the binding which identifies the source and the

property on the source to apply

3

Page 17: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ Create bindings in XAML with {Binding} markup extension

Creating bindings [XAML]

<StackLayout Padding="20" Spacing="20"><StackLayout.Resources>

<ResourceDictionary><Todo x:Key="getMilk" Title="Pickup some Milk" />

</ResourceDictionary></StackLayout.Resources><Entry Text="{Binding Title,

Source={StaticResource getMilk}}" />...

</StackLayout>

{Binding} takes the

Path as the first

unnamed argument

Assigned to Target propertySource supplied

through resource

Page 18: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ Pages often display properties from

a small number of data objects

❖ Can set the binding source on each

binding separately, or use the

BindingContext as the default

binding source

Data binding source

public class Todo{

public string Title { get; set; }public string Notes { get; set; }public bool Completed { get; set; }

}

Page 19: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ BindingContext supplies the source for any binding associated with a

view when the Binding.Source property is not set

Multiple Bindings

Todo task = new Todo() { Title = "Buy a Surface Studio", ... }; ...Name.BindingContext = task;Name.SetBinding<Todo>(Entry.TextProperty,

data => data.Title, BindingMode.TwoWay);

Useful to use a generic form of SetBinding to create bindings with typed

properties when establishing bindings in code, notice we are not setting a

source property on the binding – instead, it will use BindingContext

Page 20: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ BindingContext is automatically inherited from parent to child – can

set it once on the root view and it will be used for all children

BindingContext inheritance

public partial class TaskyDetailsPage : ContentPage{

public TaskyDetailsPage (Todo task){

BindingContext = task;InitializeComponent ();

}}

Page 21: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ BindingContext is automatically inherited from parent to child – can

set it once on the root view and it will be used for all children

BindingContext inheritance

<StackLayout Padding="20" Spacing="20"><Entry Text="{Binding Title}" /><Entry Text="{Binding Notes}" /><Switch IsToggled="{Binding Completed}" />

</StackLayout>

BindingContext = new Todo() { Title = "Buy a Surface Studio" };

By setting the binding context to the Todo, no explicit source is necessary in XAML

Page 22: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Using Data Binding in a Xamarin.Forms Application

Group Exercise

Page 23: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ {x:Reference} identifies named elements in the same XAML page –

can use this to provide a source to a Binding

View-to-View Bindings

<StackLayout Padding="20" Spacing="20"><Label Text="Hello, Bindings" TextColor="Blue" ...Rotation="{Binding Source={x:Reference slider},

Path=Value}" />...<Slider x:Name="slider" Minimum="0" Maximum="360" />

</StackLayout>

Page 24: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ Typically want data to be bi-directional

▪ source > target (always happens)

▪ target > source (optional)

Creating two-way bindings

Notes.TextChanged += (sender, e)=> task.Notes = Notes.Text;

Page 25: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

<EntryText="{Binding Notes, Mode=TwoWay}" />

❖ Binding Mode controls the direction of the data transfer, can set to

"TwoWay" to enable bi-directional bindings

Binding Mode

Notes.SetBinding(Entry.TextProperty,new Binding("Notes") {

Mode = BindingMode.TwoWay});

Manually controlled through the

Binding.Mode property

Source Property must

have public setter

Page 26: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Available Binding Modes

Source Target

Any Object

Public Property

BindableObject

BindablePropertyTwoWay

OneWayToSource

BindingMode.Default is the default value and it decides the mode based on

the target property preference – either OneWay or TwoWay

OneWay

Page 27: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ Default binding mode is property-specific, most are one-way by default

with a few exceptions that default to two-way

Default Binding Mode

DatePicker.Date SearchBar.Text

Entry.Text Stepper.Value

ListView.SelectedItem Switch.IsToggled

MultiPage<T>.SelectedItem TimePicker.Time

Picker.SelectedIndex

XAML platforms handle binding modes differently, best practice to get in the habit of

explicitly setting the mode if it's not one-way – even if it defaults to what you want

Page 28: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ One-Way and Two-Way bindings always update the UI when the source

property is changed

Pushing changes to the UI

task.Notes = "Buy Groceries";

public class Todo{

public string Title { get; set; }public string Notes { get; set; }public DateTime By { get; set; }public bool Completed { get; set; }

}

Q:

How could

Xamarin.Forms know

Notes has changed?

Page 29: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ INotifyPropertyChanged provides change notification contract,

should be implemented by any modifiable model object you bind to

INotifyPropertyChanged

namespace System.ComponentModel{

public interface INotifyPropertyChanged{

event PropertyChangedEventHandler PropertyChanged;}

}

Page 30: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Implementing INotifyPropertyChanged

public class Todo : INotifyPropertyChanged{

public event PropertyChangedEventHandler PropertyChanged;

string notes;public string Notes {

get { return notes; }set {

if (notes != value) {notes = value;

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Notes));

}}

}}

Must raise the PropertyChanged

event when any property is changed

– otherwise the UI will not update

Page 31: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ Binding will subscribe to the PropertyChanged event and update the

target property when it sees the source property notification

INPC + Bindings

Binding

1 Raise PropertyChange notification

2 Binding reads new property value

3 Binding updates target property

t.Notes = "Get Groceries";

Page 32: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Keeping the UI and data in sync using Bindings

Individual Exercise

Page 33: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Flash Quiz

Page 34: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

① The source data is supplied through _____________ (Select all that apply).

a) DataContext property

b) Binding.Source property

c) BindingContext property

d) None of the above

Flash Quiz

Page 35: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

① The source data is supplied through _____________ (Select all that apply).

a) DataContext property

b) Binding.Source property

c) BindingContext property

d) None of the above

Flash Quiz

Page 36: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

② The source can be any object

a) True

b) False

Flash Quiz

Page 37: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

② The source can be any object

a) True

b) False

Flash Quiz

Page 38: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

③ The target can be any object

a) True

b) False

Flash Quiz

Page 39: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

③ The target can be any object

a) True

b) False

Flash Quiz

Page 40: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

④ Model objects should perform the following steps when a property

setter is called (pick the best answer):

a) Change the property and raise the PropertyChanged event

b) Check if the property is different, change the property and raise the

PropertyChanged event

c) Check if the property is different, raise the PropertyChanged event

and then change the property

d) None of these are correct

Flash Quiz

Page 41: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

④ Model objects should perform the following steps when a property

setter is called (pick the best answer):

a) Change the property and raise the PropertyChanged event

b) Check if the property is different, change the property and raise the

PropertyChanged event

c) Check if the property is different, raise the PropertyChanged event

and then change the property

d) None of these are correct

Flash Quiz

Page 42: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

1. Map data to visuals

2. Create bindings in code

3. Create bindings in XAML

4. Work with binding context

5. Change binding modes

6. Implement property change

notifications

Summary

Page 43: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Use value converters to

bind incompatible types

Page 44: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

1. Perform textual conversions in

XAML

2. Create a value converter

3. Apply a value converter in XAML

Tasks

Page 45: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ Binding can do simple, text formatting when going from Source > Target

Simple Textual Conversions

<Label Text="{Binding BillAmount,StringFormat='You Owe: {0:C}'}"/>

Binding calls a String.Format passing the

specified format string and the source value

before assigning it to the targetYou Owe: $26.75

public double BillAmount { get; set; }

Page 46: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ Bindings attempt to automatically coerce data when C# would allow it,

but sometimes the data available isn't quite what the UI needs to display

Going beyond textual formatting

<Label Text="{Binding PasswordStrength}"TextColor="{Binding PasswordStrength}"FontSize="24" />

Want the text color to

change based on the

password strength

Page 47: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ Value Converters enable type

coercion and formatting

❖ Assigned to Converter property of

Binding

❖ Supports optional parameter

(Binding.ConverterParameter)

Value Converters

public interface IValueConverter{

object Convert(object value,Type targetType,object parameter,CultureInfo culture);

object ConvertBack(object value,Type targetType,object parameter,CultureInfo culture);

}

Convert used for source target

ConvertBack used for target source

Page 48: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Creating a Value Converter

public class PWStrengthConverter : IValueConverter{

public object Convert(object value, Type targetType, object parameter, CultureInfo culture){

PasswordStrength pwdstr = (PasswordStrength) value;...return Color.Red;

}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){

throw new NotSupportedException();}

}

Converter performs whatever

translation is necessary to provide

target with data – this can be simple

conversions or even completely

different objects!

Page 49: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Creating a Value Converter

public class PWStrengthConverter : IValueConverter{

public object Convert(object value, Type targetType, object parameter, CultureInfo culture){

PasswordStrength pwdstr = (PasswordStrength) value;...return Color.Red;

}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){

throw new NotSupportedException();}

}

Provides backwards conversion for

two-way binding, or can throw

exception if this is not supported –

this will cause a runtime failure

Page 50: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ Value Converter is assigned to the binding Converter property

Using a Value Converter

var binding = new Binding("PasswordStrength"){Converter = new PWStrengthConverter()

}; Source TargetBinding

Converter

Binding passes values through converter

<ContentPage.Resources><ResourceDictionary>

<c:PWStrengthConverter x:Key="pwsCvt"/></ResourceDictionary>

</ContentPage.Resources>

<Label TextColor="{Binding PasswordStrength,Converter={StaticResource pwsCvt}}" />

Page 51: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

❖ Can use dummy converter to debug data bindings – gets called during

the data transfer and provides for a convenient breakpoint location

Debugging Bindings

Check out https://github.com/xamarinhq/xamu-infrastructure for several great reusable

value converters – including this one

Page 52: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Using Value Converters

Individual Exercise

Page 53: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Flash Quiz

Page 54: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

① IValueConverter.Convert is called when going from _____ to _____

a) Source > Target

b) Target > Source

Flash Quiz

Page 55: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

① IValueConverter.Convert is called when going from _____ to _____

a) Source > Target

b) Target > Source

Flash Quiz

Page 56: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

② To pass a binding-specific parameter to a value converter, you can set

the ________ property.

a. Parameter

b. ConversionParameter

c. ConverterParameter

d. BindingParameter

Flash Quiz

Page 57: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

② To pass a binding-specific parameter to a value converter, you can set

the ________ property.

a. Parameter

b. ConversionParameter

c. ConverterParameter

d. BindingParameter

Flash Quiz

Page 58: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

③ Binding.StringFormat can be used to convert an integer type to a

double type

a. True

b. False

Flash Quiz

Page 59: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

③ Binding.StringFormat can be used to convert an integer type to a

double type

a. True

b. False

Flash Quiz

Page 60: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

1. Perform textual conversions in

XAML

2. Create a value converter

3. Apply a value converter in XAML

Summary

Page 61: Data Binding in Xamarin · Xamarin.Forms XAM270. Information in this document is subject to change without notice. The example companies, ... Classes created to represent data are

Thank You!

Please complete the class survey in your profile:

university.xamarin.com/profile