我有以下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>
谢谢大家的答案,这些答案引导我找到这个解决方案。
答案 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}"/>