6

Mam pasek postępu, który chcę zmienić kolor w zależności od wartości boolowskiej; true jest zielony, a false jest czerwony. Mam kod, który wygląda na to, że powinien działać (zwraca poprawną wartość, gdy wiążę go do pola tekstowego), ale nie wtedy, gdy jest to właściwość koloru paska postępu. Konwerter jest zdefiniowany jako ten (w App.xaml.cs ponieważ chcę do niego dostęp w dowolnym miejscu):IValueConverter nie działa dla 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; 
    } 
} 

Następnie dodać następujące do App.xaml (więc może być źródłem globalnego):

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

i dodaje następujące do MainPage.xaml aby wyświetlić je:

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

a potem w MainPage.xaml.cs, i zdefiniowanie klasy do przechowywania danych i powiązać go z pola listy:

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; 
     } 
    } 
} 

Dołączyłem minimal working example, więc można go zbudować i przetestować. Obraz wyjścia jest tutaj:

enter image description here

Zwraca wartości z przetwornika do pola tekstowego, ale nie pasek postępu. Kiedy uruchamiam debugger, nawet go nie nazywam.

Dzięki za pomoc!

+0

Czy to nie zadziała, jeśli twój konwerter zwróci solidColorBrush, a następnie powiążesz go bezpośrednio z własnością ForeGround na pasku ProgressBar? – BigL

+0

Wow - to działało. Wciąż dostaję powiesić xaml, więc to nie jest coś, co próbowałem. Jeśli uznasz to za odpowiedź, zaakceptuję to. Dzieki za sugestie! –

+0

@TaylorSouthwick Wysłano jako odpowiedź. Cieszę się że mogłem pomóc. :) – BigL

Odpowiedz

3

Spróbuj zmodyfikować konwerter, aby zwrócić wartość SolidColorBrush, a następnie powiąż bezpośrednio z Twoją własnością pierwszoplanową ProgressBars.