动态设置Silverlight控件的背景颜色(列表框)

时间:2008-09-30 09:31:54

标签: silverlight

如何动态设置列表框中项目的背景颜色?即我的业务对象上有一些属性我也是绑定的,所以基于一些业务规则我希望背景颜色不同?

        <ListBox Background="Red">
      <ListBox.ItemContainerStyle>
          <Style TargetType="ListBoxItem">
              <Setter Property="Background" Value="Red"/>
          </Style>
      </ListBox.ItemContainerStyle>
 <ListBox.ItemTemplate>
      <DataTemplate>
                    <StackPanel Orientation="Horizontal"
                                Margin="5">
                        <TextBlock VerticalAlignment="Bottom"
                                   FontFamily="Comic Sans MS"
                                   FontSize="12"
                                   Width="70"
                                   Text="{Binding Name}" />
                        <TextBlock VerticalAlignment="Bottom"
                                   FontFamily="Comic Sans MS"
                                   FontSize="12"
                                   Width="70"
                                   Text="{Binding Age}" />
                     </StackPanel>
                </DataTemplate>
        </ListBox.ItemTemplate>
      </ListBox>

编辑:它说here

  

在Silverlight中,您必须添加x:Key   属性到您的自定义样式和   将它们作为静态资源引用。   Silverlight不支持隐式   使用TargetType应用的样式   属性值。

这会影响我的做法吗?

4 个答案:

答案 0 :(得分:2)

好的 - 如果您需要自定义逻辑来确定背景,那么我将研究构建一个简单的IValueConverter类。您只需要实现IValueConverter接口,并在其Convert方法中将提供的值更改为Brush。

以下是来自Sahil Malik的快速帖子,描述了IValueConverters - 它可能有所帮助:

http://blah.winsmarts.com/2007-3-WPF__DataBinding_to_Calculated_Values--The_IValueConverter_interface.aspx

答案 1 :(得分:1)

要将背景绑定到多个属性,可以使用IMultiValueConverter。它就像IValueConverter一样,只不过它可以与MultiBinding一起将多个值传递给一个类并返回一个值。

这是我在IMultiValueConverter和MultiBinding上发现的一篇文章:

http://blog.paranoidferret.com/index.php/2008/07/21/wpf-tutorial-using-multibindings/

编辑:如果IMultiValueConverter不可用(看起来Silverlight只有IValueConverter),那么你总是可以将整个绑定对象(例如你的Person对象)传递给IValueConverter并使用其中的各种属性来返回你的画笔。 / p>

答案 2 :(得分:0)

@Matt感谢您的回复。我会研究触发器。

我唯一的问题是,确定行是否应该着色的逻辑稍微涉及更多,所以我不能只检查一个属性,所以我实际上需要运行一些逻辑来确定颜色。有什么想法吗?

我想我可以创建一个包含我需要的所有相关字段的UI对象,但我有点不想采用这种方法。

答案 3 :(得分:0)

您可以尝试将controltemplate中的内容(即边框或​​其他内容)绑定到TemplateBackground。然后在列表框中设置背景以确定其颜色。

<Border Margin="-2,-2,-2,0" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,1,0" CornerRadius="11,11,0,0">