2012-01-10 11 views
1

を働いていないテキストブロックをリストボックスにバインド:は、私は次の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のプロパティです。溶液で

LATER EDITは

イェンスの答えは私が間違っていたところを見せてくれたものでした。 ObservableCollectionに単純なメッセージログ文字列を格納する代わりに、MessageクラスとColorメンバを含む新しいクラス(LogItems)を作成しました。 LogCollectionは、文字列の代わりにタイプのLogItemsです。

私は自分のviewmodelに次のコードをリストボックスに移入:

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

とビューは次の形式を持っています。また、datacontextも同じであるため、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>    

このソリューションに私を導いていただきありがとうございます。

答えて

2

リストボックス内の生成されたコンテナのDataContextは自動的に対応する項目に設定されるため、バインディングはMyColorプロパティを検出しません。 RelativeSourceバインディングを使用して、含まれているリストのDataContextにバインドする必要があります。

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

バインディングが動作します。残念なことに、フォアグラウンドはリストアイテムの1つではなくリストボックスアイテム全体に適用されます。私はListViewと同じ結果に変更しようとしました。 – alexandrudicu

+0

あなたは何をしたいですか?すべてのItemが独自の色を持つ必要がある場合は、LogCollectionの項目にMyColorプロパティを導入する必要があります。それ以外の場合:どのアイテムを色付けするべきですか? – Jens

関連する問題