【问题标题】:Dynamically setting background colour of a Silverlight control (Listbox)动态设置 Silverlight 控件的背景颜色(列表框)
【发布时间】:2010-09-14 05:18:45
【问题描述】:

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

        <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 应用的样式 属性值。

这会影响我的方法吗?

【问题讨论】:

    标签: silverlight


    【解决方案1】:

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

    这里有一篇来自 Sahil Malik 的快速帖子,它描述了 IValueConverters - 它可能会有所帮助:

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

    【讨论】:

      【解决方案2】:

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

      这是我在 IMultiValueConverter 和 MultiBinding 上找到的一篇文章:

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

      编辑:如果 IMultiValueConverter 不可用(看起来 Silverlight 只有 IValueConverter),那么您始终可以将整个绑定对象(例如您的 Person 对象)传递给 IValueConverter 并使用其中的各种属性来返回您的 Brush。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多