6

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í:

enter image description here

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!

+0

¿No funcionaría si su convertidor devuelve un solidColorBrush, y lo vincula directamente a la Propiedad ForeGround de su ProgressBar? – BigL

+0

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! –

+0

@TaylorSouthwick Lo publicó como respuesta. Me alegro de poder ayudar. :) – BigL

Respuesta

3

Intente modificar su convertidor para devolver un SolidColorBrush y luego vincular directamente a su propiedad de primer plano ProgressBars.

Cuestiones relacionadas