IValueConverter不适用于SolidColorBrush

时间:2012-01-11 15:54:55

标签: silverlight windows-phone-7 data-binding ivalueconverter

我有一个进度条,我想根据布尔值改变颜色; true为绿色,false为红色。我有代码似乎应该工作(它将它绑定到文本框时返回正确的值)但不是当它是进度条的颜色属性时。转换器定义为此(在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;
        }
    }
}

我附加了一个minimal working example,因此可以构建和测试它。输出的图像在这里:

enter image description here

它返回转换器中文本框的值,但不返回进度条。当我运行调试器时,它甚至都没有调用它。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

尝试修改您的转换器以返回SolidColorBrush,然后直接绑定到您的ProgressBars前景属性。