2010-03-23 61 views
0

我有一个实际显示两列数据的数据绑定列表框。它显示如下:我怎样才能使这个显示列表框?

<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> 

Then Then Itemsource set in codebehind。

但是,基于某种逻辑,我想在其中一列设置一行或一个项目,例如,一个红色的水果,或大胆的线。我有代码来确定我想在后面的代码中区分哪种水果或颜色(通过颜色/粗体),但我无法弄清楚,特别是在自定义列表框显示的情况下,我如何才能设置特定项目以不同的颜色/粗体显示。

有没有人有任何想法?

让我知道是否需要任何进一步的代码。干杯。

编辑:我真正想要做的就是让问题尽可能简单......循环遍历列表框中的每个项目,并检查一个字符串,如果有匹配项目SOMEHOW在视觉上区分这一点item list/listview中。没有必要把它做得比它需要的更复杂。为什么你无法单独设置项目前景色超出了我的想象!

编辑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

你的数据是如何建模的 - 水果是一个字符串,一个水果对象还是一个集合?什么信息控制显示,例如你有一个IsPrizeWinningFruit属性,你想显示为粗体,还是你需要基于它的名字,或什么? – itowlson 2010-03-23 01:20:13

+0

水果和颜色都是对象,例如属性名称和代码。此屏幕显示两者之间的关系(水果和颜色)。有三个文本文件fruit.txt,color.txt和relationship.txt。应用程序有三个屏幕 - 水果,颜色和关系。 Frut可以添加删除水果。颜色添加删除颜色。关系 - 可以将两者联系起来。试图在这个屏幕上显示两件事情 - 如果一个水果处于关系中但是从fruit.txt中缺失,而相反,如果fruit处于fruit.txt中但不处于relationship.txt中。我已经用另一个列表框显示第二个例子。 – baron 2010-03-23 02:15:09

回答

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> 
+0

啊真棒!仍然完全了解数据绑定,这让事情变得如此简单。这是一个完美的解决方案,真正帮助我理解数据绑定的力量。非常感谢! – baron 2010-03-24 00:21:34

0

DataTriggers将照顾这。这里有一个好的底漆:http://en.csharp-online.net/WPF_Styles_and_Control_Templates%E2%80%94Data_Triggers

+0

我可以在该行,颜色或粗体属性中设置一行或一个项目吗?这似乎大多数事情,我谷歌搜索说,你只能设置整个列表框的字体,前景,粗体属性等... – baron 2010-03-23 02:09:43

+0

此外,这个例子不太适合 - >而不是一个X或O,我有一个潜在的名单字符串名称检查每个值 – baron 2010-03-23 02:48:20