Silverlight DataGridRow基于列值的背景颜色更改以及来自datagrid itemsource的绑定

时间:2011-06-29 20:05:48

标签: silverlight-4.0

我正在尝试根据列值对行进行着色,并且可能是值转换器中的其他计算,但只要我将背景值设置为任何绑定或除了硬编码颜色之外的任何其他颜色值=“红色” setter,它会抛出一个XAML解析错误。我这样实施:

<sdk:DataGrid ItemsSource="{Binding
EmailJobs}"
AutoGenerateColumns="False" 
Height="Auto"
HorizontalAlignment="Center" 
Name="dgEmailJObs"
VerticalAlignment="Top" 
Width="Auto"       Grid.Row="2">


<sdk:DataGrid.RowStyle>
                <Style TargetType="sdk:DataGridRow">
                    <Style.Setters>
                          <Setter Property="Background"
Value="{Binding Path=Status,
Converter={StaticResource
valueConverter}}"/>
                    </Style.Setters>
                </Style>
            </sdk:DataGrid.RowStyle>
            <sdk:DataGrid.Columns>
                <sdk:DataGridTextColumn
CanUserReorder="False"
CanUserResize="False"
CanUserSort="True" Header="Customer"
Width="Auto" Binding="{Binding
Customer}" />
                <sdk:DataGridTextColumn
CanUserReorder="False"
CanUserResize="False"
CanUserSort="True" Header="Program"
Width="Auto"  Binding="{Binding
Program}" />
                <sdk:DataGridTextColumn
CanUserReorder="False"
CanUserResize="False"
CanUserSort="True"
Header="Application" Width="Auto" 
Binding="{Binding Application}"/>
                <sdk:DataGridTextColumn
CanUserReorder="True" 
CanUserResize="False"
CanUserSort="True" Header="Status"
Width="Auto"  Binding="{Binding
Status}"></sdk:DataGridTextColumn>
                <sdk:DataGridTextColumn
CanUserReorder="False"
CanUserResize="False"
CanUserSort="True" Header="Last
Created By" Width="Auto" 
Binding="{Binding LastChangedBy}"/>
                <sdk:DataGridTextColumn
CanUserReorder="False"
CanUserResize="False"
CanUserSort="True" Header="Last
Created On" Width="Auto" 
                           Binding="{Binding
LastChangedOn,StringFormat='MM/DD/YYYY
hh:mm tt'}" />
            </sdk:DataGrid.Columns>                       
        </sdk:DataGrid>

我正在使用MVVM并且不想使用触发事件。我想要的只是简单地向转换器提供第四列值,但它会爆炸,应该是非常简单的jsut缺乏XAML绑定知识:(任何帮助

3 个答案:

答案 0 :(得分:2)

我想我明白了...... Silverlight 4不允许(不再)绑定到Setters。

但是,有两种简单的解决方案可以解决您的问题:

  • 您可以移除<sdk:DataGrid.RowStyle>及其内容,并将其替换为RowStyle="{Binding Path=Status, Converter={StaticResource valueConverter}}"作为您的数据网格的属性(以下示例)

    <sdk:DataGrid Grid.Column="1" ItemsSource="{Binding EmailJobs}" RowStyle="{Binding Path=Status, Converter={StaticResource valueConverter}}" AutoGenerateColumns="False" HorizontalAlignment="Center" Name="dgEmailJObs" Width="Auto" Margin="0,0,0,87" LoadingRow="dgEmailJObs_LoadingRow">

或者,您可以在触发事件LoadingRow:

后在代码中管理它
void dgEmailJObs_LoadingRow(object sender, DataGridRowEventArgs e)
{
    myClass c = e.Row.DataContext as myClass;
    if (c != null)
    {
        if (c.Status == "Stopped")
        {
            e.Row.Background = new SolidColorBrush(Colors.Red);
        }
        else
        {
            e.Row.Background = new SolidColorBrush(Colors.Green);
        }
    }
}

希望有所帮助;)

答案 1 :(得分:1)

private void grdPendingRequest_LoadingRow(object sender, DataGridRowEventArgs e)
{
    string changedColPath = string.Empty;
    dynamic itemData = (dynamic)e.Row.DataContext;
    if (itemData != null)
        changedColPath = itemData.Changed_Field;

    if (changedColPath != string.Empty)
    {
        string colPath;
        System.Windows.Data.Binding binding;
        string[] ChangedColNameList = null;

        foreach (DataGridColumn col in grdPendingRequest.Columns)
        {
            if (col is DataGridBoundColumn)
            {
                binding = (col as DataGridBoundColumn).Binding;
                colPath = binding.Path.Path;
                ChangedColNameList = changedColPath.Split(';');

                if (ChangedColNameList.Contains(colPath))
                {
                    FrameworkElement felt = col.GetCellContent(e.Row);
                    FrameworkElement felt_result = GetParent(felt, typeof(DataGridCell));
                    if (felt_result != null)
                    {
                        DataGridCell cell = (DataGridCell)felt_result;
                        //cell.Background = new SolidColorBrush(Color.FromArgb(255, 196, 219, 249));
                        cell.Background = new SolidColorBrush(Colors.Red);
                    }
                }
            }
        }
    }
}

答案 2 :(得分:0)

我的价值转换器:

public class EmailJobStatusConverter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (value.ToString()=="Stopped") ? 
                new SolidColorBrush(Colors.Red) : 
                new SolidColorBrush(Colors.Green);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        SolidColorBrush resultColor = value as SolidColorBrush;

        if (resultColor.Color == Colors.Green)
        {
            return "Green";
        }
        else 
            return "Red";
    }
}