IValueConverter не работает для SolidColorBrush - PullRequest
6 голосов
/ 11 января 2012

У меня есть индикатор выполнения, который я хочу изменить цвет в зависимости от логического значения; истина - зеленый, ложь - красный. У меня есть код, который, кажется, должен работать (он возвращает правильное значение, когда я связываю его с текстовым полем), но не когда это свойство цвета индикатора выполнения. Конвертер определяется следующим образом (в App.xaml.cs, так как я хочу получить к нему доступ где угодно):

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

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

enter image description here

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

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

1 Ответ

3 голосов
/ 11 января 2012

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

...