TOC

This article has been localized into Italian by the community.

Data binding:

La proprietà StringFormat

Come abbiamo visto nei capitoli precedenti, per manipolare l'output di un'associazione prima che sia mostrata, ci si affida in genere all'uso di un convertitore. Il bello dei convertitori è che ti permettono di convertire qualsiasi tipo di dati in un tipo di dati completamente diverso. Tuttavia, per scenari di utilizzo più semplici, quando vuoi semplicemente cambiare il modo in cui viene mostrato un certo valore, e non necessariamente convertirlo in un tipo diverso, la proprietà StringFormat potrebbe essere più che sufficiente.

Usando la proprietà StringFormat in un binding, si perderà un pò di flessibilità che si ottiene quando si utilizza un convertitore, ma in cambio è molto più semplice da utilizzare e non comporta la creazione di una nuova classe in un nuovo file.

La proprietà StringFormat fa esattamente ciò che indica il nome: applica un formato alla stringa di output, semplicemente chiamando il metodo String.Format. A volte un esempio vale più di mille parole, quindi prima arrivare a tale cifra, passiamo direttamente a un esempio:

<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="StringFormatSample" Height="150" Width="250"
		Name="wnd">
	<StackPanel Margin="10">
		<TextBlock Text="{Binding ElementName=wnd, Path=ActualWidth, StringFormat=Window width: {0:#,#.0}}" />
		<TextBlock Text="{Binding ElementName=wnd, Path=ActualHeight, StringFormat=Window height: {0:C}}" />
		<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, StringFormat=Date: {0:dddd, MMMM dd}}" />
		<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, StringFormat=Time: {0:HH:mm}}" />
	</StackPanel>
</Window>

La prima coppia di TextBlock prende i propri valori (Width e Height) da un bind sulla Window genitore. Questi valori vengono formattati attraverso la proprietà StringFormat. Per la larghezza (width) specifichiamo un formato particolare, mentre per l’altezza (height) chiediamo di usare il formato corrente. Il valore è salvato come double, così da poter chiamare il metodo double.ToString(). Puoi trovare una lista qui: http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

Nella StringFormat si può specificare un testo personalizzato, così da permettere all’utente di pre/postporre a proprio piacimento il valore con del testo. Quando si fa riferimento al valore attuale nella format string, bisogna racchiuderlo tra parentesi graffe; in particolare, bisogna specificare un riferimento al valore da formattare (valore 0, il primo valore possibile) e la format string, separati dai due punti.

Per la seconda coppia di TextBlock, facciamo un bind con la data corrente (DateTime.Now) e gli output sono rispettivamente una data, in un formato specifico, e l’ora, nel formato HH:mm. Puoi leggere di più sulla formattazione dei DateTime qui http://msdn.microsoft.com/en-us/library/az4se3k1.aspx

Formattare senza testo aggiuntivo

Se si specifica una format string che non include alcun testo personalizzato (come negli esempi sopra), si dovrà aggiungere un set extra di parentesi graffe al momento della definizione in XAML. Il motivo è che WPF potrebbe altrimenti confondersi con quelle usate nel Markup Extension. Ecco un esempio:

<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="StringFormatSample" Height="150" Width="250"
		Name="wnd">
	<WrapPanel Margin="10">
		<TextBlock Text="Width: " />
		<TextBlock Text="{Binding ElementName=wnd, Path=ActualWidth, StringFormat={}{0:#,#.0}}" />
	</WrapPanel>
</Window>

Usare una specifica culture

Se è necessario avere un output in base a una cultura specifica, il binding userà la lingua specificata per l’elemento padre oppure la si può specificare direttamente nel binding, usando la proprietà ConverterCulture. Ecco un esempio:

<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatCultureSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="StringFormatCultureSample" Height="120" Width="300">
	<StackPanel Margin="10">
		<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='de-DE', StringFormat=German date: {0:D}}" />
		<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='en-US', StringFormat=American date: {0:D}}" />
		<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='ja-JP', StringFormat=Japanese date: {0:D}}" />
	</StackPanel>
</Window>

È piuttosto semplice: combinando la proprietà StringFormat, che utilizza l'identificatore D (modello di data lunga) e la proprietà ConverterCulture, possiamo generare i valori associati in base a una cultura specifica. Abbastanza elegante!


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!