如何将Background绑定到StackPanel

时间:2013-06-26 08:00:49

标签: c# xaml windows-8

我正在开发Windows8商店应用程序。我有动态填充的网格

<Grid Grid.Column="1" Margin="0,16,0,0" HorizontalAlignment="Left" VerticalAlignment="Center">
                <GridView x:Name="chapterlist" HorizontalAlignment="Left" VerticalAlignment="Top" Width="auto" ItemClick="onChapterClick" Padding="0" Height="600" Margin="0" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
                    <GridView.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Width="260" Height="80" Background="{Binding RelativeSource={RelativeSource Self}, Path=alreadyDownload, Converter={StaticResource ColorConverter}}">                                    
                                <TextBlock x:Name ="AAA" Text="{Binding Path=Chapter}" FontSize="10" Foreground="White" d:LayoutOverrides="Width" Margin="5" TextWrapping="Wrap" />
                                <TextBlock Text="{Binding Path=Name}" Foreground="White" d:LayoutOverrides="Width" TextWrapping="Wrap"/>
                                <TextBlock Text="{Binding Path=alreadyDownload}" Foreground="#073363" VerticalAlignment="Bottom"  HorizontalAlignment="Right" Margin="0,18,2,2" FontSize="10" d:LayoutOverrides="Width" TextWrapping="Wrap"/>
                            </StackPanel>
                        </DataTemplate>
                    </GridView.ItemTemplate>
                </GridView>
            </Grid>

所以我必须根据TextBlock值改变StackPanel的背景颜色,如

<TextBlock Text="{Binding Path=alreadyDownload}" Foreground="#073363" VerticalAlignment="Bottom"  HorizontalAlignment="Right" Margin="0,18,2,2" FontSize="10" d:LayoutOverrides="Width" TextWrapping="Wrap"/>

我使用了像

这样的ColorConverter
class ColorConverter : IValueConverter
{
    public object Convert(object value, System.Type targetType, object parameter, String culture)
    {
        if (value != null)
        {
            if (value.Equals("Already Downloaded "))
                return Colors.Red;
            else
                return Colors.White;
        }

        return Colors.White;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

但我的网格没有反映背景颜色(实际上根本没有颜色,透明)。为什么会发生这种情况?我怎么解决这个问题?请帮忙。我附上图片供参考。提前致谢 enter image description here

所以我想要的是用已经下载的文本显示网格应该有其他颜色和其他颜色不同的网格。

3 个答案:

答案 0 :(得分:1)

有两种方法可以完成上述场景

1)我们可以将Background属性添加到填充ObservableCollection并在xaml中使用绑定的对象

<Grid Width="200" Background="{Binding Background}" />

这样我们可以选择网格中的每个项目颜色,并动态更改它只是更改对象属性。这里的Background属性必须是一个用有效颜色分配的字符串,如

object.Background = "White"

2)使用Converter(我使用的)将对象中的一些现有属性转换为颜色(请参阅我的Converter类)。我们也可以使用像我在这里使用的一些属性绑定

<TextBlock Text="{Binding Path=alreadyDownload}"

看起来像

<StackPanel Width="260" Height="80" Background="{Binding RelativeSource={RelativeSource Self}, Path=alreadyDownload, Converter={StaticResource ColorConverter}}">                                    
                            <TextBlock x:Name ="AAA" Text="{Binding Path=Chapter}" FontSize="10" Foreground="White" d:LayoutOverrides="Width" Margin="5" TextWrapping="Wrap" />
                            <TextBlock Text="{Binding Path=Name}" Foreground="White" d:LayoutOverrides="Width" TextWrapping="Wrap"/>
                            <TextBlock Text="{Binding Path=alreadyDownload}" Foreground="#073363" VerticalAlignment="Bottom"  HorizontalAlignment="Right" Margin="0,18,2,2" FontSize="10" d:LayoutOverrides="Width" TextWrapping="Wrap"/>
                        </StackPanel>

那么为什么我的代码没有运行?因为IValueConverter返回的对象应该是一个字符串,所以不要使用

if (value.Equals("Already Downloaded "))
            return Colors.Red;
        else
            return Colors.White;

使用

 if (value.Equals("Already Downloaded "))
                return "#FF0000";
            else
                return "#FFFFFF";

所以它完美运行

答案 1 :(得分:0)

if (value.Equals("Already Downloaded "))

可能是 Downloaded 和“?

之间的空格

答案 2 :(得分:0)

请改用此代码:

if (value.Equals("Already Downloaded "))
        return Brushes.Red;
    else
        return Brushes.White;

或者如果你想使用颜色类,你可以这样使用。

new SolidColorBrush(Colors.Red)

希望这可以解决您的问题。