在列表框中绑定文本块不起作用

时间:2012-01-10 08:31:23

标签: wpf binding datacontext textblock

我有以下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>

通过这种方式,我想为整个列表框设置项目的前景,但它不起作用。我如何找到正确的datacontext? MyColor是我的MainViewModel上的一个属性。

稍后编辑解决方案

Jens的答案是向我展示我错在哪里的答案。我没有在ObservableCollection中存储简单的消息日志字符串,而是创建了一个包含Message和Color成员的新类(LogItems)。现在,LogCollection是LogItems的类型而不是字符串。

我使用viewmodel中的以下代码填充列表框:

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

该视图具有以下形式。此外,它不再需要使用RelativeSource,因为datacontext是相同的。

<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 个答案:

答案 0 :(得分:2)

列表框中生成的容器的DataContext会自动设置为相应的项目,因此您的Binding找不到Property MyColor。您需要使用RelativeSource绑定绑定到包含列表的DataContext:

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