代码改变世界

[Avalon] Avalon中的Conditional Formatting.

2005-08-22 20:52  Colin Han  阅读(1226)  评论(0编辑  收藏  举报

大家应该都知道Excel中的Conditional Formatting的功能吧。我们可以设置一些条件,当条件满足时修改格子的格式信息。

例如:一个学生成绩表中,我们可以设置当学生成绩低于60分时,将文字颜色改为红色。

如果我们要在我们的应用程序中实现这样的功能,就必须写比较多的代码。但是,在Avalon中集成了对此项功能的支持。下面是一个XAML描述。

  <Grid Name="mainGrid" VerticalAlignment="Top" HorizontalAlignment="Left">
    
<Grid.Resources>
      
<c:bgConverter x:Key="BGConverter"/>

      
<DataTemplate x:Key="BookItemTemplate">
        
<Grid>
          
<ColumnDefinition Width="250" SharedSizeGroup="BTitle" />
          
<ColumnDefinition Width="100" SharedSizeGroup="BISBN" />
          
<ColumnDefinition Width="*" SharedSizeGroup="BNPAGES" />
          
<TextBlock TextContent="{Binding Path=Title}" Grid.Column="0"
            FontWeight
="Bold"/>
          
<TextBlock TextContent="{Binding Path=ISBN}" Grid.Column="1"/>
          
<Border Grid.Column="2"
            Background
="{Binding Path=NumPages,
              Converter={StaticResource BGConverter}}"
>
            
<TextBlock TextContent="{Binding Path=NumPages}"/>
          
</Border>
        
</Grid>
      
</DataTemplate>

      
<Style x:Key="liStyle" TargetType="{x:Type ListBoxItem}">
        
<Setter Property="Width" Value="Auto"/>
      
</Style>
    
</Grid.Resources>

    
<RowDefinition Height="80" />
    
<RowDefinition Height="Auto" />
    
<ColumnDefinition Width="250" />
    
<ColumnDefinition Width="Auto" />
    
<ColumnDefinition Width="*" />

    
<ListBox Name="lb" Height="500" Width="400"
      HorizontalAlignment
="Left"
      ItemsSource
="{Binding Path=BookTable}"
      ItemTemplate  ="{StaticResource BookItemTemplate}"
      ItemContainerStyle="{StaticResource liStyle}"
      IsSynchronizedWithCurrentItem
="True"
      IsSelectionRequired
="True"
      Background
="Honeydew"
      Grid.IsSharedSizeScope
="true"
      Grid.Row
="0" Grid.Column="0" Grid.ColumnSpan="2"/>
    
<TextBlock TextContent="{Binding Path=BookTable#.Count}"
      Grid.Row
="1" Grid.Column="0" />
    
<Button Click="OnClick" Grid.Row="1" Grid.Column="1">Add Record</Button>
  
</Grid>

代码中用黄色标注的部分是实现Conditional Formatting的主要逻辑。我们再来看一下c:bgConverter的实现:
  public class bgConverter : IValueConverter
  
{
    
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    
{
      
int numValue = (int)value;
      
if (numValue < 350)
        
return System.Windows.Media.Brushes.Green;
      
else
        
return System.Windows.Media.Brushes.Red;
    }


    
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    
{
      
return null;
    }

  }

Ok, 我们来看一下程序的运行效果。


如此就实现了“当书的页数多于350页时背景色改为红色”的功能。基本的实现方式就是在进行数据绑定时,提供了挂接IValueConverter的能力。开发人员可以在这里挂接自己的Converter,实现各种Conditional Formatting.

完整的程序可以在Avalon的SDK中找到。WinFS SDK->Simples->"Avalon" Simples->Technology Simples->Data->Data Binding->Binding with Data in an ADO DataSet Sample
或从这里下载