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 ya que quiero acceder a él en cualquier lugar):IValueConverter no funciona para SolidColorBrush
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;
}
}
luego añadir lo siguiente a la App.xaml (lo que puede 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>
que añade lo siguiente al 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 enlazarlo al cuadro de lista:
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 minimal working example por lo que solo se puede construir y probar. Una imagen de la salida es 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!
¿No funcionaría si su convertidor devuelve un solidColorBrush, y lo vincula directamente a la Propiedad ForeGround de su ProgressBar? – BigL
Guau, eso funcionó. Todavía estoy tomando el control de xaml, así que eso no es algo que haya intentado. Si pones eso como una respuesta, lo aceptaré. ¡Gracias por la sugerencia! –
@TaylorSouthwick Lo publicó como respuesta. Me alegro de poder ayudar. :) – BigL