silverlight Grid ListBox行改变颜色

时间:2011-10-19 19:13:56

标签: silverlight colors listbox

我有一个我正在学习的银色手机应用程序。它使用Web服务来获取数据。我有一个网格,里面有一个列表框。我希望能够将该列表框中的一些文本设置为基于条件的特定颜色。

 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <ListBox x:Name="MainListBox" Margin="0,0,-12,0"  SelectionChanged="MainListBox_SelectionChanged">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,0,0,17" Width="432">
                        <TextBlock Text="{Binding Operation}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                        <TextBlock Text="{Binding Status}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                        <TextBlock Text="{Binding DateTimeStart1}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                        <TextBlock Text="{Binding DataID}" Visibility="Collapsed"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>

所以如果绑定到Status的文本块..如果那个status = true我想改变行的颜色甚至只是那个文本框....更容易。

我使用以下代码绑定数据

 Me.MainListBox.ItemsSource = e.Result

任何帮助都会很棒

~~~~~~~~~~~~~~~~~~~~~~~~~~ 这是修改后的代码

  Private Class SomeData
    Inherits wsData.Data_Queries
    Public Property RowColor As SolidColorBrush
End Class

这里是我创建类的新实例并将其绑定到列表框

的地方
 Dim oSomeDataS As New List(Of SomeData)
    For Each x In e.Result
        Dim oSomeData As New SomeData
        With x
            oSomeData.DataID = .DataID
            oSomeData.DateTimeStart1 = .DateTimeStart1
            oSomeData.FinishFromStart = .FinishFromStart
            oSomeData.Operation = .Operation
            oSomeData.ShortDate = .ShortDate
            oSomeData.Status = .Status
            oSomeData.TblComputerNameID = .TblComputerNameID
            oSomeData.TblOperationID = .TblOperationID
            oSomeData.TblStatusID = .TblStatusID
            oSomeData.TblSiteID = .TblSiteID

            If .Status = "False" Then
                oSomeData.RowColor = New SolidColorBrush(Colors.Red)
            Else
                oSomeData.RowColor = New SolidColorBrush(Colors.Green)
            End If
            oSomeDataS.Add(oSomeData)
        End With
    Next
    Me.MainListBox.ItemsSource = oSomeDataS.OrderBy(Function(o) o.Operation)

和XAML代码

 <ListBox x:Name="MainListBox" Margin="0,0,-12,0"  SelectionChanged="MainListBox_SelectionChanged">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,0,0,17" Width="432">
                        <TextBlock Text="{Binding Operation}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                        <TextBlock Text="{Binding Status}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}" Foreground="{Binding RowColor}"/>
                        <TextBlock Text="{Binding DateTimeStart1}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                        <TextBlock Text="{Binding DataID}" Visibility="Collapsed"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

1 个答案:

答案 0 :(得分:0)

有很多不同的方法可以做到这一点。最容易理解的是使用IValueConverter将行的背景颜色绑定到基于状态的颜色。可以找到一个很好的例子here(示例是WPF,但同样的原则适用于Silverlight)。

另一种方法是将您的数据对象(您从e.Result获得)包装在ViewModel对象中。 ViewModel对象将公开与数据相同的所有属性,但也会添加一个属性(可能是RowColor),其中getter根据Status的值返回Brush或Color。您必须遍历e.Results并为每个创建一个新的ViewModel,将ViewModel添加到列表中,然后将ItemsSource设置为新的ViewModel列表。