2012-01-10 19 views
1

我有以下XAML代码:绑定在列表框中用的TextBlocks不工作

<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中存储简单的消息日志字符串,而是创建了一个包含Message和Color成员的新类(LogItems)。现在LogCollection是typeof LogItems而不是字符串。

我填充用下面的代码列表框在我的视图模型:

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>    

谢谢大家给我的解答。

回答

2

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

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

绑定现在可以使用。不幸的是,前景应用于整个列表框项目而不是仅仅一个项目。我试图将其更改为ListView,并得到相同的结果。 – alexandrudicu 2012-01-10 09:07:17

+0

你想达到什么目的?如果每个项目应具有自己的颜色,则应在LogCollection中的项目上引入MyColor属性。否则:哪个项目应该着色? – Jens 2012-01-10 09:35:51