silverlight windows-phone-7 data-binding ivalueconverter

silverlight - IValueConverter no funciona para SolidColorBrush



windows-phone-7 data-binding (1)

Tengo una barra de progreso que quiero cambiar de color dependiendo de un valor booleano; true es verde y falso es rojo. Tengo un código que parece que debería funcionar (devuelve el valor correcto cuando lo vinculo a un cuadro de texto) pero no cuando es la propiedad de color de la barra de progreso. El convertidor se define como esto (en App.xaml.cs porque quiero acceder a él en cualquier lugar):

public class ProgressBarConverter : System.Windows.Data.IValueConverter { public object Convert( object o, Type type, object parameter, System.Globalization.CultureInfo culture) { if (o == null) return null; else //return (bool)o ? new SolidColorBrush(Colors.Red) : // new SolidColorBrush(Colors.Green); return (bool)o ? Colors.Red : Colors.Green; } public object ConvertBack( object o, Type type, object parameter, System.Globalization.CultureInfo culture) { return null; } }

A continuación, agrego lo siguiente a App.xaml (para que pueda ser un recurso global):

<Application.Resources> <local:ProgressBarConverter x:Key="progressBarConverter" /> <DataTemplate x:Key="ItemTemplate"> <StackPanel> <TextBlock Text="{Binding name}" Width="280" /> <TextBlock Text="{Binding isNeeded, Converter={StaticResource progressBarConverter}}" /> <ProgressBar> <ProgressBar.Foreground> <SolidColorBrush Color="{Binding isNeeded, Converter={StaticResource progressBarConverter}}" /> </ProgressBar.Foreground> <ProgressBar.Background> <SolidColorBrush Color="{StaticResource PhoneBorderColor}"/> </ProgressBar.Background> </ProgressBar> </StackPanel> </DataTemplate> </Application.Resources>

Agregué lo siguiente a MainPage.xaml para mostrarlos:

<Grid x:Name="LayoutRoot" Background="Transparent"> <ListBox x:Name="listBox" ItemTemplate="{StaticResource ItemTemplate}"/> </Grid>

Y luego en MainPage.xaml.cs, defino una clase para contener los datos y enlazarlos a listBox:

namespace PhoneApp1 { public class TestClass { public bool isNeeded { get; set; } public string name { get; set; } } public partial class MainPage : PhoneApplicationPage { // Constructor public MainPage() { InitializeComponent(); var list = new LinkedList<TestClass>(); list.AddFirst( new TestClass { isNeeded = true, name = "should be green" }); list.AddFirst( new TestClass { isNeeded = false, name = "should be red" }); listBox.ItemsSource = list; } } }

He adjuntado un ejemplo de trabajo mínimo para que pueda ser construido y probado. Una imagen de la salida está aquí:

Devuelve los valores del convertidor para el cuadro de texto pero no la barra de progreso. Cuando ejecuto el depurador, ni siquiera lo llama.

¡Gracias por cualquier ayuda!


Intenta modificar tu convertidor para devolver un SolidColorBrush y luego vincular directamente a tu propiedad ProgressBars primer plano.