PDA

View Full Version : [WPF] Utilizzare IValueConverter ma nascondere il valore nella cella


robertino_salemi
22-01-2015, 14:35
Ciao a tutti,
nella mia applicazione WPF, ho una colonna età che comprendere un range da 0 a 100.

Sto usando un Convert per impostare un colore di sfondo a una singola cella secondo sei range da me impostati....
Vorrei colorare la cella, ma nascondere il valore numerico.

La colorazione funziona, ma non riesco a nascondere il valore...

Come posso fare questo?

Questo è il mio codice:
XAML:

<DataGridTextColumn Binding="{Binding Age}" Header="Age - Color Range" Width="200">
<!-- COLOR CELLA -->
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Background" Value="{Binding Age, Converter={StaticResource ColorToCell}}"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>


C#

public class ColorToCell : IValueConverter
{

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int tempValue = int.Parse(value.ToString());
string tempString = "Red";
if (tempValue >= 0 && tempValue <= 20)
tempString = "#FF0000";

if (tempValue > 20 && tempValue <= 40)
tempString = "#F09300";

if (tempValue > 40 && tempValue <= 60)
tempString = "#EDDF00";

if (tempValue > 60 && tempValue <= 80)
tempString = "#CC00FF55";

if (tempValue > 80 && tempValue <= 100)
tempString = "#85AB00";


SolidColorBrush brush = new SolidColorBrush();
BrushConverter conv = new BrushConverter();
brush = conv.ConvertFromString(tempString) as SolidColorBrush;
return brush;

}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
}


Grazie.

wingman87
22-01-2015, 16:18
Se setti anche il foreground allo stesso colore? Il valore ci sarebbe lo stesso ma non si vedrebbe...

robertino_salemi
22-01-2015, 16:36
Giusta, ottima soluzione:

<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Background" Value="{Binding Age, Converter={StaticResource ColorToCell}}"/>
<Setter Property="Foreground" Value="{Binding Age, Converter={StaticResource ColorToCell}}"/>
</Style>
</DataGridTextColumn.ElementStyle>


Non c'è comunque modo, per l'operatore di vedere il valore contenuto nella cella, giusto?

[Kendall]
22-01-2015, 17:11
Giusta, ottima soluzione:

<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Background" Value="{Binding Age, Converter={StaticResource ColorToCell}}"/>
<Setter Property="Foreground" Value="{Binding Age, Converter={StaticResource ColorToCell}}"/>
</Style>
</DataGridTextColumn.ElementStyle>


Non c'è comunque modo, per l'operatore di vedere il valore contenuto nella cella, giusto?

E se elimini il binding dal DataGridTextColum? In questa maniera la cella di testo dovrebbe comparire vuota, e il binding nello stile funzionare ugualmente (se non ricordo male).

robertino_salemi
22-01-2015, 17:16
Uhm, cioè? :confused:

[Kendall]
22-01-2015, 17:38
Uhm, cioè? :confused:

No spe. Non mi ero accorto di una cosa.
Come mai utilizzi una DataGridTextColumn se non ti serve avere un campo di testo?

robertino_salemi
23-01-2015, 08:35
;42051330']No spe. Non mi ero accorto di una cosa.
Come mai utilizzi una DataGridTextColumn se non ti serve avere un campo di testo?

Perchè?
DataGridTextColumn rappresenta una cella all'interno del controllo DataGrid che ospita un contenuto testuale, no?
Potrei usare un altro approccio?

[Kendall]
23-01-2015, 08:54
Perchè?
DataGridTextColumn rappresenta una cella all'interno del controllo DataGrid che ospita un contenuto testuale, no?
Potrei usare un altro approccio?

Rappresenta una colonna precisamente (come dice il nome stesso) dove ogni cella è un campo di testo.
Se però, come da tua richiesta, non vuoi visualizzare testo ma solo un colore (se non ho capito male la richiesta) non hai bisogno di questa tipologia di colonna.
Puoi definire una DataGridTemplateColumn, e settare il suo template come un semplice rettangolo, nel quale definirai il background come fatto in precedenza.

robertino_salemi
23-01-2015, 10:00
Grazie Kendall,
mi sto avvicinando da poco al mondo WPF e non conosco bene ancora queste sottili differenze.

Seguendo il tuo suggerimento ho ottenuto l'effetto desiderato:

<DataGridTemplateColumn Header="Age 1 - Color Range" Width="200">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Rectangle Width="200" Height="16">
<Rectangle.Fill>
<SolidColorBrush Color="{Binding Age, Converter={StaticResource ColorToCell}}"></SolidColorBrush>
</Rectangle.Fill>
</Rectangle>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>


Approfitto della tua disponibilità e conoscenze nel settore: potresti linkarmi una valida guida in WPF?

Grazie.

[Kendall]
23-01-2015, 10:26
Io a suo tempo ho trovato molto piacevoli da leggere e ben scritti i libri di Adam Nathan.
Nello specifico puoi leggerti WPF 4.5 Unleashed che è abbastanza recente.

robertino_salemi
23-01-2015, 10:49
Grazie, gentilissimo! :)