DarioSantarelli.Blog("UgiDotNet");

<sharing mode=”On” users=”*” />
posts - 176, comments - 105, trackbacks - 3

My Links

News


This is my personal blog. These postings are provided "AS IS" with no warranties, and confer no rights.




Tag Cloud

Archives

Post Categories

My English Blog

WPF: La potenza di IValueConverter

Oggi, con una certa soddisfazione , ho sperimentato sulla mia pelle l'utilizzo di IValueConverter, un' interfaccia molto utile (contenuta nel namespace System.Windows.Data di presentationframework.dll) che rende possibile il binding tra proprietà di tipo diverso nel mondo WPF.
Nello specifico, all'interno della mia applicazione ho riscontrato il bisogno di un metodo veloce per effettuare il binding tra alcune proprietà di oggetti custom (ordini precisamente... che fantasia !!!) e proprietà di presentazione di una ListBox. Grazie all' implementazione dell'interfaccia IValueConverter, per ciascun ListBoxItem in binding ho potuto quindi realizzare la conversione del valore della proprietà Priority del mio oggetto Order nel valore della proprietà Foreground del corrispondente TextBlock (che visualizza il nome dell'ordine). 
Ecco l'esempio:

<Window ... xmlns:mydata="clr-namespace:MyNamespace"> <Window.Resources> <DataTemplate DataType="{x:Type mydata:Order}"> <StackPanel Orientation="Vertical"> <TextBlock Text="{Binding Path=Name}"> <TextBlock.Foreground> <Binding Path="Priority"> <Binding.Converter> <mydata:PriorityConverter /> </Binding.Converter> </Binding> </TextBlock.Foreground> </TextBlock> </StackPanel> </DataTemplate> </Window.Resources> <StackPanel> <TextBlock>Elenco Ordini...</TextBlock> <ListBox Name="ordersListBox" ItemsSource="{Binding}"></ListBox> </StackPanel> </Window>

 

Tramite il markup XAML ho impostato la mia classe PriorityConverter come Converter all'interno del binding verso la proprietà Foreground del TextBlock contenente il nome dell'ordine, mentre nel codebehind ho definito la classe PriorityConverter come implementazione dell'interfaccia IValueConverter nel seguente modo:

public class PriorityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value != null) { // Priority è un enum all'interno dell'oggetto Order Priority priority = (Priority)value; BrushConverter colorConverter = new BrushConverter(); switch (priority) { case Priority.High: return colorConverter.ConvertFromString("#FF0000") as Brush; case Priority.Normal: return colorConverter.ConvertFromString("#000000") as Brush; case Priority.Low: return colorConverter.ConvertFromString("#0000FF") as Brush; default: break; } } return null; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return null; } }

Nel mio caso l'implementazione del metodo ConvertBack non è stata necessaria dal momento che il Binding di interesse è one-way, ovvero dal livello business logic al livello di presentazione. Degno di nota è anche l'oggetto BrushConverter, in grado di restituire, grazie al metodo ConvertFromString, un oggetto che rappresenta un Brush (notare il cast esplicito) partendo dalla rappresentazione del colore sottoforma di stringa di caratteri esadecimali.
Questo è lo scheletro del risultato ottenuto:



Il vero vantaggio di questo approccio si trova evidentemente nella riusabilità, dal momento che esso può rilevarsi utile ma soprattutto indolore ad esempio in tutti quei contesti applicativi in cui il presentation layer può essere completamente stravolto pur mantenendo il business logic layer consistente e praticamente inalterato.

Print | posted on venerdì 13 luglio 2007 19:24 | Filed Under [ WPF ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET