niedziela, 26 sierpnia 2012

[WPF] DataBinding : Mode, UpdateSourceTrigger

Data binding może być stosowany na wiele sposobów. WPF umożliwia określenie trybu, oraz sposobu uaktualniania danych. Przez tryb rozumiany jest głównie kierunek przepływu danych. Ustawia się go przez property Mode.

 <TextBox  Text="{Binding Mode=OneWay, ElementName=main, Path=MyText1}" />
 <TextBox  Text="{Binding Mode=TwoWay, ElementName=main, Path=MyText2}" />
 <TextBox  Text="{Binding Mode=OneWayToSource,ElementName=main, Path=MyText3}" />
 <TextBox  Text="{Binding Mode=OneTime,ElementName=main, Path=MyText4}" />


Tryby data bindingu :
  • OneWay
Cel jest aktualizowany przy każdej zmianie źródła, zmiany celu (np. zmiana teksu w TextBoxie) pozostaje bez wpływu na stan źródła.
  • TwoWay
Zarówno zmiana źródła danych, jak i celu spowoduje zmiany po drugiej stronie.
  • OneWayToSource
Odwroność OneWay. Zmiana celu powoduje zmianę źródła danych, w drugą stronę zmiany nie zachodzą.
  • OneTime
Target pobiera dane ze źródła w momencie bindowania, następnie połączenie zostaje niejako zerwane: zmiany źródła nie aktualizują celu, podobnie zmiany celu nie powodują zmian w źródle.

Jeśli chodzi o domyślny tryb, to dla większości DependencyProperties jest to OneWay. Wyjątkiem jest np. TextBox.Text, gdzie domyślnie ustawiony jest tryb TwoWay.

Drugą użyteczną opcją, jest UpdateSourceTrigger. Można w ten sposób ustawić, kiedy ma dojść do aktualizacji danych.


<TextBox Text="{Binding Mode=TwoWay, ElementName=main, Path=MyText1, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding Mode=TwoWay, ElementName=main, Path=MyText1, UpdateSourceTrigger=LostFocus}" />
<TextBox Text="{Binding Mode=TwoWay, ElementName=main, Path=MyText1, UpdateSourceTrigger=Explicit}" />

  • PropertyChanged
Aktualizacja następuje przy każdej zmianie property. Oznacza to, że np. wpisując do pustego TextBoxa słowo kot, nastąpią trzy zmiany źródła : przy dopisaniu każdej litery.
  • LostFocus
Domyślny tryb dla TextBox.Text. Zmiana zachodzi, gdy kontrolka będąca targetem straci focus. Oszczędza się wtedy niepotrzebnych zmian źródła.
  • Explicit
W tym przypadku, musimy jawnie aktualizować źródło w następujący sposób:


var bindingExpr = textBox7.GetBindingExpression(TextBox.TextProperty);
bindingExpr.UpdateSource();

Brak komentarzy:

Prześlij komentarz