我有一个数据绑定列表框,它实际上显示了两列数据。它显示如下:
<UserControl.Resources>
<DataTemplate x:Key="AlignedPairs">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Fruits}" Grid.Column="0" />
<TextBlock Text="->" TextAlignment="Center" Grid.Column="1" />
<TextBlock Text="{Binding Colors}" Grid.Column="3" />
</Grid>
</DataTemplate>
</UserControl.Resources>
<ListBox Name="lbStuff" Grid.ColumnSpan="2" Grid.Row="1"
ItemTemplate="{StaticResource AlignedPairs}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
然后在代码隐藏中设置Itemsource。
然而,根据某些逻辑,我想在其中一列中设置一行或一项,例如果实变成红色,或者变成粗体。我有代码来解决我想在后面的代码中区分(通过颜色/粗体)的水果或颜色,但我无法弄清楚,特别是考虑到自定义列表框显示,我如何设置特定项目用不同的颜色/粗体。
有没有人有任何想法?
如果需要进一步的代码,请告诉我。欢呼声。
编辑:我真正想做的就是让问题尽可能简单...循环浏览列表框中的每个项目并检查字符串,如果匹配SOMEHOW在列表框/列表视图中可视地区分此项目。没有必要使它比它需要的更复杂。为什么你无法单独设置项目前景颜色超出我的范围!
编辑2:
看起来我几乎可以通过以下方式到达那里(但它会引发异常并且不起作用)
foreach (var li in ListView.Items)
{
if (someCriteria == true)
{
((ListViewItem) li).Foreground = Brushes.Red;
//exception throw as this is the actual object stored in this location (the Fruit object for example) not the row or listviewitem I want to change the color of so it can't be cast :(
}
}
答案 0 :(得分:1)
这是ViewModel设计模式真正帮助你的地方。
据推测,您有一个公开属性Fruit
和Color
的类。创建一个包装类,公开这两个属性,并公开,例如,FruitBackgroundBrush
和ItemBackgroundBrush
。然后,您可以绑定到模板中的这些属性,例如:
<DataTemplate x:Key="AlignedPairs">
<Grid Background={Binding ItemBackgroundBrush}>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Fruits}"
Background="{Binding FruitBackgroundBrush}"
Grid.Column="0" />
<TextBlock Text="->" TextAlignment="Center" Grid.Column="1" />
<TextBlock Text="{Binding Colors}" Grid.Column="3" />
</Grid>
</DataTemplate>
答案 1 :(得分:0)
DataTriggers会处理这个问题。这是一本很好的入门书:http://en.csharp-online.net/WPF_Styles_and_Control_Templates%E2%80%94Data_Triggers