6

У меня есть индикатор выполнения, который я хочу изменить цвет в зависимости от логического значения; true - зеленый, а false - красный. У меня есть код, который кажется, что он должен работать (он возвращает правильное значение, когда я привязываю его к текстовому полю), но не тогда, когда это свойство цвета индикатора выполнения. Преобразователь определяется как это (в App.xaml.cs, так как я хочу, чтобы получить доступ к нему в любом месте):IValueConverter не работает для 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; 
    } 
} 

Я затем добавить следующее в App.xaml (так что он может быть глобальным ресурсом):

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

Я добавил следующее MainPage.xaml для их отображения:

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

, а затем в MainPage.xaml.cs, я определить класс для хранения данных и привязать его к 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; 
     } 
    } 
} 

Я приложил minimal working example, чтобы его можно было просто построить и протестировать. Изображение на выходе здесь:

enter image description here

возвращает значения из конвертера для текстового поля, но не прогресс бар. Когда я запускаю отладчик, он даже не вызывает его.

Спасибо за помощь!

+0

Не работает ли он, если ваш конвертер возвращает solidColorBrush, и вы привязываете это свойство ForeGround вашего ProgressBar напрямую? – BigL

+0

Вау - это сработало. Я все еще получаю хэмил, так что это не то, что я пробовал. Если вы поместите это как ответ, я приму это. Спасибо за предложение! –

+0

@TaylorSouthwick Отправил это как ответ. Я рад, что смогу помочь. :) – BigL

ответ

3

Попробуйте изменить ваш конвертер, чтобы вернуть SolidColorBrush, а затем привязать непосредственно к свойству ProgressBars переднего плана.