Как получить значение привязки текущей ячейки в WPFToolkit DataGrid - PullRequest
2 голосов
/ 26 марта 2009

Я хочу изменить основной цвет ячеек, которые содержат отрицательные числа, но я не знаю, как указать DataTrigger, который позволил бы мне. Я использую что-то вроде этого:

<Style x:Key="NumberCellStyle" BasedOn="{StaticResource CellStyle}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Converter={StaticResourceExtension SignConverter}}" Value="-1">
            <Setter Property="TextBlock.Foreground" Value="Red"/> 
        </DataTrigger>
    </Style.Triggers>
</Style>

Но в конвертере SignConverter я получаю всю ViewModel вместо числового значения, которое я хочу преобразовать. Я хочу, чтобы это работало в приложении, без необходимости указывать правильный путь для каждой привязки.

Большое спасибо!

Ответы [ 4 ]

2 голосов
/ 28 марта 2009

Лучше, напишите пользовательский столбец.

Код следует для всех, кто находится в такой же ситуации:

public class DataGridDecimalColumn : DataGridTextColumn
{
    Binding               foregroundBinding;
    DecimalBrushConverter brushConverter = new DecimalBrushConverter {
        NegativeBrush = Brushes.Red, 
        PositiveBrush = Brushes.Black, 
        ZeroBrush     = Brushes.Black,
    };

    protected override FrameworkElement 
    GenerateElement(DataGridCell cell, object dataItem)
    {
        var element = base.GenerateElement(cell, dataItem) as TextBlock;
        element.SetBinding(TextBlock.ForegroundProperty, GetForegroundBinding());
        return element;
    }

    Binding
    GetForegroundBinding()
    {
        if(foregroundBinding == null) {
            var binding       = (Binding)Binding;
            foregroundBinding = new Binding {
                Path      = binding.Path,
                Converter = BrushConverter,
            };
        }
        return foregroundBinding;
    }

    public DecimalBrushConverter 
    BrushConverter
    {
        get { return brushConverter; }
        set { brushConverter = value; }
    }
}

DecimalBrushConverter просто принимает десятичную дробь? и преобразует его в одну из указанных кистей в зависимости от ее значения.

0 голосов
/ 30 июня 2009

Как бы вы получили этот код для чтения свойства IsSelected самой DataGrid? Я попробовал следующий код, но не могу понять, как получить значение bool в ConverterParameter, где DecimalBrushConverter читает параметр и предоставляет SelectedBrush, если isSelected == true.

открытый класс DataGridDecimalColumn: DataGridTextColumn { частное чтение только для DecimalBrushConverter _brushConverter = новый DecimalBrushConverter { NegativeBrush = Brushes.Red, PositiveBrush = Brushes.Black, ZeroBrush = Brushes.Black, SelectedBrush = Brushes.White };

    private Binding _foregroundBinding;

    private DecimalBrushConverter BrushConverter
    {
        get { return _brushConverter; }
    }



    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        var element = base.GenerateElement(cell, dataItem) as TextBlock;

        if (element != null)
            element.SetBinding(TextBlock.ForegroundProperty, GetForegroundBinding());

        return element;
    }



    private Binding GetForegroundBinding()
    {
        if (_foregroundBinding == null)
        {
            var binding = (Binding) Binding;
            var bindingToRow = new Binding
                                   {
                                       Path = new PropertyPath("IsSelected"),
                                       RelativeSource=new RelativeSource(RelativeSourceMode.FindAncestor,typeof(DataGridRow),1)
                                   };
            _foregroundBinding = new Binding
                                     {
                                         Path = binding.Path,
                                         Converter = BrushConverter,
                                         ConverterParameter = bindingToRow
                                     };
        }
        return _foregroundBinding;
    }
}
0 голосов
/ 27 марта 2009

ОК, я не нашел способа решить свою исходную проблему, но я обойду ее, используя DataGridTemplateColumn с шаблонами, которые правильно устанавливают цвет переднего плана в зависимости от значения, которое к ним привязано.

0 голосов
/ 26 марта 2009

Какой контроль вы применяете стиль тоже? Звучит так, будто все, к чему вы применяете, не имеет каких-либо конкретных привязок, поэтому оно просто наследует значение своих родителей, которое в итоге становится вашим ViewModel экземпляром.

Обновление : Основываясь на комментарии, я думаю, что вам нужно указать Path в выражении Binding стиля. Поскольку путь не указан, он просто использует текущий DataContext, который в конечном итоге становится полным экземпляром ViewModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...