Привязка в списке с текстовыми блоками не работает - PullRequest
1 голос
/ 10 января 2012

У меня есть следующий код xaml:

<ListBox Foreground="{Binding MyColor, Converter={local:ColorConverter}}" ItemsSource="{Binding LogCollection, Mode=TwoWay}" Grid.Row="1">
</ListBox>

Это меняет цвет переднего плана для всего списка, поэтому я изменил код следующим образом:

<ListBox ItemsSource="{Binding LogCollection, Mode=TwoWay}" Grid.Row="1">
   <ListBox.ItemTemplate>
      <DataTemplate>
      <TextBlock Foreground="{Binding MyColor, Converter={local:ColorConverter}}"  Text="{Binding}"/>
      </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

Таким образом, я хотел установить передний план для элемента вместо всего списка, но он не работает. Как мне найти правильный текст данных? MyColor - это свойство моей MainViewModel.

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ С РЕШЕНИЕМ

Ответ Дженса был тем, который показал мне, где я был неправ. Вместо того, чтобы хранить простые строки журнала сообщений в ObservableCollection, я создал новый класс (LogItems), который содержит элементы Message и Color. Теперь LogCollection является типом LogItems вместо строк.

Я заполняю список следующим кодом в моей модели представления:

LogItems logitem = new LogItems(myMessage, myColor);
LogCollection.Insert(0, logitem);

И вид имеет следующую форму. Также больше не требуется использовать RelativeSource, потому что текст данных одинаков.

<ListBox ItemsSource="{Binding LogCollection, Mode=TwoWay}" Grid.Row="1">                        
 <ListBox.ItemTemplate>                             
  <DataTemplate>
   <TextBlock Foreground="{Binding Path=Color, Converter={local:ColorConverter}}" Text="{Binding Path=Message}"/>
  </DataTemplate>
 </ListBox.ItemTemplate>
</ListBox>              

Спасибо всем за ответы, которые привели меня к этому решению.

1 Ответ

2 голосов
/ 10 января 2012

DataContext сгенерированного контейнера в списке автоматически устанавливается для соответствующего элемента, поэтому ваша привязка не находит свойство MyColor.Вам необходимо использовать привязку RelativeSource для привязки к DataContext содержащего списка:

<TextBlock Foreground="{Binding DataContext.MyColor, 
                                RelativeSource={RelativeSource 
                                        Mode=FindAncestor, 
                                        AncestorType={x:Type ListBox}}, 
                                Converter={local:ColorConverter}}"  
           Text="{Binding}"/>
...