我怎么能为列表框制作这个显示?

时间:2010-03-23 00:33:51

标签: c# wpf listbox

我有一个数据绑定列表框,它实际上显示了两列数据。它显示如下:

<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 :(
                }
            }

2 个答案:

答案 0 :(得分:1)

这是ViewModel设计模式真正帮助你的地方。

据推测,您有一个公开属性FruitColor的类。创建一个包装类,公开这两个属性,并公开,例如,FruitBackgroundBrushItemBackgroundBrush。然后,您可以绑定到模板中的这些属性,例如:

<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