У меня есть индикатор выполнения, который я хочу изменить цвет в зависимости от логического значения; 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, чтобы его можно было просто построить и протестировать. Изображение на выходе здесь:
возвращает значения из конвертера для текстового поля, но не прогресс бар. Когда я запускаю отладчик, он даже не вызывает его.
Спасибо за помощь!
Не работает ли он, если ваш конвертер возвращает solidColorBrush, и вы привязываете это свойство ForeGround вашего ProgressBar напрямую? – BigL
Вау - это сработало. Я все еще получаю хэмил, так что это не то, что я пробовал. Если вы поместите это как ответ, я приму это. Спасибо за предложение! –
@TaylorSouthwick Отправил это как ответ. Я рад, что смогу помочь. :) – BigL