2012-01-10 20 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