Home > Silverlight > Changing Foreground of cells that are modified in DataGrid

Changing Foreground of cells that are modified in DataGrid

Lets say you have a DataGrid in a page and want to show the cells with changed values as in this forum post.

Before edit

after edit

here is one way. (It wont work with DataGrid with Scrollbars)

Sample xaml

<UserControl xmlns:data=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data”
             x:Class=”SLDataGridSample.Page”
             xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation
             xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml
             xmlns:vsm=”clr-namespace:System.Windows;assembly=System.Windows”
             xmlns:localprimitives=”clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data”
             Width=”400″
             Height=”300″>
    <UserControl.Resources>
    </UserControl.Resources>
    <Grid x:Name=”LayoutRoot”
          Background=”White”>
        <data:DataGrid x:Name=”grid1″
                       AutoGenerateColumns=”False”>
            <data:DataGrid.Columns>
                <data:DataGridTextColumn Width=”100″
                                         Header=”FirstName”
                                         Binding=”{Binding FirstName}”>

                </data:DataGridTextColumn>
                <data:DataGridTextColumn Header=”LastName”
                                         Binding=”{Binding LastName}”></data:DataGridTextColumn>
                <data:DataGridTextColumn Header=”HomeTown”
                                         Binding=”{Binding HomeTown}”></data:DataGridTextColumn>
            </data:DataGrid.Columns>
        </data:DataGrid>

    </Grid>
</UserControl>

 public Page()
        {
            InitializeComponent();
            grid1.ItemsSource = new People();
            grid1.PreparingCellForEdit += new EventHandler<DataGridPreparingCellForEditEventArgs>(grid1_PreparingCellForEdit);
            grid1.CurrentCellChanged += new EventHandler<EventArgs>(grid1_CurrentCellChanged);
        }

        void grid1_CurrentCellChanged(object sender, EventArgs e)
        {
            if (column != null && row != null)
            {
                TextBlock textBlock = (column.GetCellContent(row) as TextBlock);
                textBlock.Foreground = new SolidColorBrush(Colors.Blue);
                row = null;
                column = null;
            }
        }

        DataGridRow row;
        DataGridColumn column;
        void grid1_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
        {
            column = e.Column;
            row = e.Row;          
        }     

When the cell is getting ready to be edited we save the row and column and when the current cell changes we get the CellContent (usually a TextBlock, unless you are showing something different or have a CellTemplate)  and change the Foreground. Finally reset our variables

Categories: Silverlight