#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. когда данные возвращаются как сервис, и я смотрю на элемент в списке, разница, которую я вижу, заключается в том, что для каждого свойства в элементе есть второе свойство с тем же именем и полем, добавленное в конец. просто выкладываю это на случай, если кто-то может помочь