niedziela, 27 listopada 2011

MVVM cz 3, Komunikacja View-ViewModel - StringFormat

Bardzo ciekawym feature'm Bindingu jest StringFormat. Dzięki niemu, jeżeli chcemy w jakiś sposób sformatować bindowany text to nie musimy tworzyć dodatkowych konwerterów czy kilku obiektów typu TextBlock. Działa to praktycznie tak samo jak metoda String.Format() wywoływana z kodu. Czyli w nawiasach {} podajemy numer argumentu a pomiędzy nawiasami możemy wrzucać dowolny tekst. Przykłady:
<TextBox Text="{Binding SomeText, StringFormat='Moj text: {0}'}"/>

<TextBox Text="{Binding SomeText, StringFormat='Moj text: \{0\}'}"/>

<TextBox>
<TextBox.Text>
<Binding Path="SomeText" StringFormat="{}Moj text: {0}"/>
</TextBox.Text>
</TextBox>

Wszystkie powyższe zapisy zwrócą ten sam rezultat:

Moj text: SomeTextValue

Tak jak widać w powyższym przykładzie, w przypadku dłuższego zapisu bindingu musimy przed naszym stringiem umieścić puste nawiasy {}. Poza tym w skróconym zapisie możemy użyć ukośnika przed nawiasem, jednak nie jest to konieczne.
Istnieje też możliwość podłączenia kilku wartości które sformatujemy. W takim wypadku musimy wykorzystać MultiBinding. Różni się on tym od zwykłego Bindingu, że możemy podłączyć kilka właściwości źródłowych, które zostaną za pomocą StringFormat scalone w jeden string.

<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="czas1: {0} czas2: {1} czas3: {2}">
<Binding Path="Time1"/>
<Binding Path="Time2"/>
<Binding Path="Time3"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>

Co więcej możemy sformatować daną wartość za pomocą mechanizmu zdefiniowanego w Frameworku lub napisanym przez nas. Stosując zapis:

<TextBox Text="{Binding SomeText, StringFormat='Moj text: {0:hogan}'}"/>

tak naprawdę wywołujemy na pierwszym obiekcie SomeText metodę:

ToString(string format, IFormatProvider formatProvider)

interfejsu IFormattable z parametrem format = hogan. Takie typy jak Double czy DateTime implementują ten intefejs i mają zdefiniowane różne sposoby formatowania, dlatego łatwo nam manipulować całym zapisem. Możemy oczywiście w naszej klasie sami zaimplementować IFormattable.

<TextBox Text="{Binding Time, StringFormat=HH}"/>

<TextBox Text="{Binding Time, StringFormat=Time: {0:HH}}"/>

<TextBox Text="{Binding Time, StringFormat=Time: \{0:HH\}}"/>

<TextBox>
<TextBox.Text>
<Binding Path="Time" StringFormat="{}Time: {0:HH}"/>
</TextBox.Text>
</TextBox>

<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="czas1: {0:HH} czas2: {1:HH:mm} czas3: {2:HH:mm:ss}">
<Binding Path="Time1"/>
<Binding Path="Time2"/>
<Binding Path="Time3"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>

Tak jak widzimy w pierwszym przykładzie, jeżeli bindujemy jedną property, możemy wtedy podać do StringFormat po prostu sam parametr metody ToString.

0 komentarze:

Prześlij komentarz

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Online Project management