【问题标题】:How to bind Background to the StackPanel如何将背景绑定到 StackPanel
【发布时间】:2013-06-26 08:00:48
【问题描述】:

我正在开发 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();
    }
}

但是我的网格没有反映背景颜色(实际上根本没有颜色,它是透明的)。为什么会这样?我怎么解决这个问题?请帮助。我附上图片以供参考。提前致谢

所以我想要显示带有文本的网格已经下载应该有一些其他颜色,其余的网格有不同的颜色。

【问题讨论】:

  • 只是猜测:你不需要将绑定模式设置为TwoWay-Binding吗? {Binding Path=alreadyDownload,Mode=TwoWay}您是否尝试将背景设置为任何值?例如#0F0,检查是否存在绑定或xaml标记问题?
  • 如果没有设置,它就是双向绑定,不是吗?
  • @Lucas 照此blog post 不。
  • @Jan Hommes 好奇。我使用了许多输入字段,但没有给它们一个 BindingMode,它可以完美地工作。
  • @Lucas 你是对的,默认模式取决于 xaml 元素。文本框似乎总是具有双向绑定。看到这个msdn

标签: c# xaml windows-8


【解决方案1】:

上面提到的场景有两种方法

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

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

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

object.Background = "White"

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

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

所以它运行完美

【讨论】:

    【解决方案2】:
    if (value.Equals("Already Downloaded "))
    

    可能是 Downloaded 和 " 之间的空格吗?

    【讨论】:

    • 不,我故意在后面加上空格,因为我设置/获取的值是这样的
    【解决方案3】:

    改用此代码:

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

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

    new SolidColorBrush(Colors.Red)
    

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

    【讨论】:

    • 它放弃了自定义颜色的选项,因此不推荐。
    • 但是 stackpanel 不接受颜色类。只需尝试在文件后面的代码中给出它,您就可以理解 Colors 类有什么问题
    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 2016-04-26
    • 1970-01-01
    • 2013-08-13
    • 2013-05-22
    • 2010-12-03
    • 1970-01-01
    • 2011-05-07
    相关资源
    最近更新 更多