изменение цвета строки списка сетки silverlight

#silverlight #colors #listbox

#silverlight #Цвет #список

Вопрос:

У меня есть приложение silverlight для телефона, которое я использую для изучения. Для получения данных используются веб-службы. У меня есть сетка со списком внутри сетки. Я бы хотел, чтобы часть текста внутри этого списка имела определенный цвет в зависимости от условий.

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

Так что, если текстовый блок, который привязан к статусу.. если этот статус = 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:

Есть много разных способов сделать это. Самый простой для понимания — использовать an IValueConverter для привязки цвета фона строки к цвету, основанному на статусе. Хороший пример этого можно найти здесь (примером является WPF, но тот же принцип применяется в Silverlight).

Другой способ сделать это — обернуть ваши объекты данных (которые вы получаете из e.Result) в объект ViewModel. Объект ViewModel будет отображать все те же свойства, что и ваши данные, но также добавит одно свойство (возможно RowColor ), где средство получения возвращает кисть или цвет на основе значения Status . Вам нужно будет просмотреть свои результаты e.Results и создать новую ViewModel для каждого из них, добавить ViewModels в список, затем установить ItemsSource для этого нового списка ViewModels.

Комментарии:

1. Ошибка .. я попробовал то, что вы предложили. Я создал класс, который имеет общедоступное свойство RowColor в качестве цвета. перебрал и изменил цвет свойства. Красный и цветной. Зеленый в зависимости от состояния. в XAML добавлен Foreground=»{Привязка RowColor}». когда я запускаю его, эта строка не отображается. Если я изменю его на Foreground =»Red», это будет отображаться нормально. Так что, color — это не то, что я должен использовать для свойства RowColor

2. Вы изменили свой ItemsSource на коллекцию вашего нового класса? Не могли бы вы опубликовать код?

3. Для меня это выглядит правильно, хотя я, по общему признанию, вообще не знаю VB. Я подумал, что это C #.

4. теперь это работает .. если я добавлю свойство rowcolor в вызов webservice. Что особенного в том, что он находится в вызове веб-сервиса, а не в качестве частного класса, использующего его в списке. мой вызов веб-службы svc делает с ним что-то, что позволяет его правильно привязать.. я не уверен, что заставляет это работать

5. когда данные возвращаются как сервис, и я смотрю на элемент в списке, разница, которую я вижу, заключается в том, что для каждого свойства в элементе есть второе свойство с тем же именем и полем, добавленное в конец. просто выкладываю это на случай, если кто-то может помочь