代码改变世界

Silverlight DataGrid行背景分组着色

2011-07-28 15:30  破狼  阅读(2719)  评论(1编辑  收藏  举报

 利用Silverlight DataGrid LoadingRow事件传入参数DataGridRowEventArgs

我们可以获取到Row对象She之其背景。

下面是一个简单示例

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightApplication1
{
    
public partial class MainPage : UserControl
    {
        
public MainPage()
        {
            InitializeComponent();
        }

        List
<SourceModel> gridSources = new List<SourceModel>();

        
private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
        }

        
private void LoadSource(int n)
        {
            
if (n < 1)
                
throw new Exception("should >=1");
            gridSources.Clear();
            
for (int i = 0; i < n; i++)
            {
                gridSources.Add(
new SourceModel() { ID = i.ToString(), Name = "test" + i, Group = ((int)(new Random().NextDouble() * i)).ToString() });
            }

            
int j = 0;
            gridSources 
= gridSources.OrderBy(t => t.Group).ToList();
            gridSources.GroupBy(t 
=> t.Group).ToList().ForEach(t =>
            {
                t.ToList().ForEach(k 
=> k.BG = brushs[j % brushs.Length]);
                j
++;
            });
        }
        Brush[] brushs 
= new Brush[] { new SolidColorBrush(Color.FromArgb(128135206235)), new SolidColorBrush(Color.FromArgb(255240255240)), new SolidColorBrush(Color.FromArgb(140255970)) };
        
private void test1_Click(object sender, RoutedEventArgs e)
        {
            dgSource.ItemsSource 
= gridSources;
        }

        private void test2_Click(object sender, RoutedEventArgs e)
        {

        }

        
private void LoadSource_Click(object sender, RoutedEventArgs e)
        {
            LoadSource(
int.Parse(this.maxCount.Text));
        }

        
private void dgSource_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            e.Row.Background 
= (e.Row.DataContext as SourceModel).BG;
        }
    }

    
public class SourceModel
    {
        
public string ID { getset; }
        
public string Name { getset; }
        
public string Group { getset; }
        
public Brush BG { getset; }
    }

}

XAMl:

<UserControl x:Class="SilverlightApplication1.MainPage"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable
="d"
             xmlns:data
="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    d:DesignHeight
="300" d:DesignWidth="400"
             xmlns:i
="http://schemas.microsoft.com/expression/2010/interactivity"
     xmlns:sdk
="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"   
             xmlns:Test
="clr-namespace:SilverlightApplication1;assembly=SilverlightApplication1">
    
<Grid x:Name="LayoutRoot">
        
<Grid.RowDefinitions>
            
<RowDefinition ></RowDefinition>
            
<RowDefinition Height="26" ></RowDefinition>
        
</Grid.RowDefinitions>
        
<data:DataGrid Grid.Row="0" x:Name="dgSource" Margin="3,3,3,3" RowBackground="Black" AutoGenerateColumns="False" LoadingRow="dgSource_LoadingRow" >
            
<data:DataGrid.Columns>
                
<data:DataGridTextColumn Header="ID" Binding="{Binding ID}" IsReadOnly="True" />
                
<data:DataGridTextColumn Header="Name" Binding="{Binding Name,Mode=TwoWay}" />
                
<data:DataGridTextColumn Header="Group" Binding="{Binding Group,Mode=TwoWay}" />
                
                
<data:DataGridTextColumn Header="ID" Binding="{Binding ID}" IsReadOnly="True" />
                
<data:DataGridTextColumn Header="Name" Binding="{Binding Name,Mode=TwoWay}" />
                
<data:DataGridTextColumn Header="Group" Binding="{Binding Group,Mode=TwoWay}" />
                
                
<data:DataGridTextColumn Header="ID" Binding="{Binding ID}" IsReadOnly="True" />
                
<data:DataGridTextColumn Header="Name" Binding="{Binding Name,Mode=TwoWay}" />
                
<data:DataGridTextColumn Header="Group" Binding="{Binding Group,Mode=TwoWay}" />
            
</data:DataGrid.Columns>            
        
</data:DataGrid>
        
<StackPanel Orientation="Horizontal" Grid.Row="1">
            
<TextBox x:Name="maxCount" Width="300" Text="100000"></TextBox>
            
<Button x:Name="loadSource1" Click="LoadSource_Click" Content="Load Source" />
            
<Button x:Name="test1" Click="test1_Click" Content="Test bind" />
            
<Button  x:Name="test2"  Click="test2_Click" Content="Test 2"/>
        
</StackPanel>
    
</Grid>
</UserControl>