Пометка строки DataGrid в соответствии с критерием бизнес-правила в Silverlight 4 с использованием M-V-VM Light - PullRequest
1 голос
/ 03 мая 2011

Я написал код для изменения свойства переднего плана ячейки DataGrid, если строка, содержащая эту ячейку, соответствует заданному правилу (скажем, ее текст должен иметь значение «Incomplete»). Я могу сделать это довольно легко, перехватывая событие LoadingRow в коде и записывая там свою логику, но я чувствую, что это не очень элегантная реализация MVVM. Вот код:

// Sets the foreground color of th 5th cell to red if the text in the cell corresponds 
// to a value specified in the ViewModel.
private void dgProfile_LoadingRow(object sender, DataGridRowEventArgs e)
    {

        this.dgProfile.SelectedIndex = e.Row.GetIndex();
        DataGridColumn column = this.dgProfile.Columns[4];
        FrameworkElement fe = column.GetCellContent(e.Row);
        FrameworkElement result = GetParent(fe, typeof(DataGridCell));
        if (result != null)
        {
            DataGridCell cell = (DataGridCell)result;
            if (((TextBlock)cell.Content).Text == (this.DataContext as ProfileViewModel).strIncompleteActivityStatus) cell.Foreground = new SolidColorBrush(Colors.Red);
            else cell.Foreground = new SolidColorBrush(Colors.Black);
        }

    }
    private FrameworkElement GetParent(FrameworkElement child, Type targetType)
    {
        object parent = child.Parent;
        if (parent != null)
        {
            if (parent.GetType() == targetType)
            {
                return (FrameworkElement)parent;
            }
            else
            {
                return GetParent((FrameworkElement)parent, targetType);
            }
        }
        return null;
    }

Может кто-нибудь сказать мне, есть ли лучший способ реализовать это, используя набор инструментов MVVM Light, возможно, через RelayCommand и некоторую умную привязку данных?

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 30 июля 2011

Вы можете определить столбец шаблона и привязать свойство переднего плана к конвертеру значений, который возвращает соответствующий SolidColorBrush.

Например:

<data:DataGrid.Columns>
     <data:DataGridTemplateColumn>
                <data:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding MyProperty}"
                                   Foreground="{Binding MyProperty, Converter={StaticResource MyConverter}}"/>

                    </DataTemplate>
                </data:DataGridTemplateColumn.CellTemplate>
            </data:DataGridTemplateColumn>
</data:DataGrid.Columns>

И конвертер:

public class MyConverter : System.Windows.Data.IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null)
        {
            string propertyValue = (string)value;

            if (propertyValue == strIncompleteActivityStatus)
                return new SolidColorBrush(Colors.Red);
            else
                return new SolidColorBrush(Colors.Black);
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Подробнее здесь:

Цвет ячейки DataGrid на основе значения ячейки

...