2016-11-29 8 views
1

DataGrid.ItemSource устанавливается в код позади до dataview. Названия столбцов и счет нужно менять «на лету», поэтому список объектов работает не очень хорошо.Конвертер получает DataRowView вместо DataGridCell

У меня есть рабочий стол полностью работает. Что замечательно, , но мой GridCellStyle передает DataRowView в конвертер, а не DataGridCell, который я должен был передать.

Есть ли способ получить содержимое DataGridCell ИЛИ что-то, указывающее, какой столбец передан в текущий конвертер?

<UserControl x:Class="TestUI.SilveusTable" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:TestUI" 
      mc:Ignorable="d" 
      > 
    <UserControl.Resources> 
     <local:CbotValueConverter x:Key="CbotValueConverter" /> 
     <Style x:Key="GridCellStyle" TargetType="{x:Type DataGridCell}"> 
      <Setter Property="Background" Value="Yellow"/> 
      <Setter Property="Foreground" Value="{Binding Converter={StaticResource CbotValueConverter}}"/> 
     </Style> 
    </UserControl.Resources> 
    <Grid> 
     <DataGrid x:Name="DataGrid1" IsReadOnly="True" CellStyle="{StaticResource GridCellStyle}" /> 
    </Grid> 
</UserControl> 

Вот мой конвертер класса

[ValueConversion(typeof(DataGridCell), typeof(SolidColorBrush))] 
    public class CbotValueConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var dgc = (DataGridCell) value; 
      var rowView = (DataRowView) dgc.DataContext; 
      var v = rowView.Row.ItemArray[dgc.Column.DisplayIndex]; 

      decimal amount; 
      if (decimal.TryParse(v.ToString(), out amount)) 
      { 
       if (amount >= 10) return Brushes.Red; 
       if (amount >= 5) return Brushes.Blue; 
       if (amount > 0) return Brushes.Green; 
      } 

      return Brushes.Black; //quantity should not be below 0 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
+0

«Это то, что я ожидал пройти». Это неправильное ожидание. Если вы явно не установили источник привязки (по источнику, RelativeSource или ElementName), Binding использует текущий DataContext в качестве своего источника. Здесь это текущий элемент из коллекции Items или ItemsSource. – Clemens

+0

Учитывая, что стиль привязан к * DataGridCell *, а тег - * CellStyle *, ожидая, что он передаст то самое, что привязано к конвертеру, похоже, очень разумное ожидание. Как еще вы собираетесь выполнять преобразование, основанное на содержимом ячейки? –

+0

Стиль не связан ни с чем. Свойства в установках стиля могут быть привязаны к свойствам текущего DataContext, если только Binding явно не указывает другой источник. Кроме того, содержимое ячейки не является DataGridCell. См. Здесь: [Обзор шаблонов данных] (https://msdn.microsoft.com/en-us/library/ms742521 (v = vs.110) .aspx). – Clemens

ответ

2

изменение Источник связывания

с currect связывания декларации, DataContext из DataGridCell является источником

Value="{Binding Converter={StaticResource CbotValueConverter}}" 

использовать DataGridCell сам добавляет RelativeSource Self часть (относится к элементу, на котором вы устанавливают привязку)

Value="{Binding Converter={StaticResource CbotValueConverter}, 
       RelativeSource={RelativeSource Self}}"