Привязка переднего плана текстового столбца таблицы данных WPF - PullRequest
5 голосов
/ 25 июня 2010

Я пытаюсь построить DataGrid и хочу привязать одно из свойств Foreground TextColums к Date, чтобы оно стало красным, если Date уже в прошлом.

Здесь XAML:

<toolkit:DataGridTextColumn 
   Binding="{Binding Path=Prüfdatum, Converter={StaticResource TimestampToDateConverter}}"
   Header="Prüfdatum" 
   Foreground="{Binding Path=Prüfdatum, Converter={StaticResource TimestampToColorConverter},
   ConverterParameter=Prüfdatum}" />

Вот мой конвертер:

    class TimestampToColorConverter: IValueConverter
{
    #region IValueConverter Member

    public object Convert(object value, Type targetType, 
           object parameter, System.Globalization.CultureInfo culture)
    {
        string Datum = value.ToString();
        int year = System.Convert.ToInt32(Datum.Substring(6, 4));
        int month = System.Convert.ToInt32(Datum.Substring(3, 2));
        int day = System.Convert.ToInt32(Datum.Substring(0, 2));
        int hour = System.Convert.ToInt32(Datum.Substring(11, 2));
        int minute = System.Convert.ToInt32(Datum.Substring(14, 2));
        int second = System.Convert.ToInt32(Datum.Substring(17, 2));
        DateTime Time = new DateTime(year, month, day, hour, minute, second);
        if (Time < System.DateTime.Now)
        {
            return Brushes.Red as Brush;
        }
        else
        {
            return Brushes.Black as Brush;
        }

    }

    public object ConvertBack(object value, Type targetType, 
         object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }

    #endregion
}

Я не знаю, что не так, но конвертер даже не вызывается (первый конвертер работает отлично). Окно вывода показывает это:

System.Windows.Data Ошибка: 2: не удается найти управляющий FrameworkElement или FrameworkContentElement для целевой элемент BindingExpression: Path = Prüfdatum; DataItem = NULL; целевой элемент
'DataGridTextColumn' (HashCode = 16187528); целевое свойство это «Передний план» (тип «Кисть»)

Надеюсь, вы мне поможете, ребята

Thx

Ответы [ 3 ]

5 голосов
/ 20 апреля 2015

DataGridTextColumn указывает DataGrid создать TextBlock для каждой строки в этом столбце. Затем DataGridTextColumn.Binding устанавливает привязку для TextBlock.Text, которая запускается при каждом создании новой строки и нового TextBlock для этой строки.

Я не знаю, будет ли когда-либо выполнено связывание, но не чаще, чем один раз (т.е. не для каждой строки):

Binding = "{Binding Path = Prüfdatum, Converter = {StaticResource TimestampToDateConverter}}"

Правильным решением является создание стиля для этого текстового блока и определение привязки для ForeGround. Это будет выполнено для каждого сгенерированного TextBlock. Задача здесь для TextBlock - найти данные. Это может быть достигнуто с помощью относительной привязки к DataGridRow, предку в визуальном дереве. DataGridRow.Item предоставляет доступ к данным за сеткой:

<Window.Resources>
  <Style x:Key="ForegroundStyle" TargetType="TextBlock">
    <Setter Property="Foreground" 
      Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, 
      Path=Item.Prüfdatum, 
      Converter={StaticResource TimestampToColorConverter}/>
  </Style>
</Window.Resources>

<DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding SomeData}" ElementStyle="{StaticResource ForegroundStyle}"/>
</DataGrid.Columns>

Сложно, верно? Я рекомендую вам прочитать мою подробную статью о форматировании сетки данных по адресу: http://www.codeproject.com/Articles/683429/Guide-to-WPF-DataGrid-formatting-using-bindings?msg=5037235#xx5037235xx

Удачи, тебе это нужно: -)

0 голосов
/ 12 апреля 2018

Привязка данных свойства ForeGridTextColumn Foreground не работает.

Ответ Питера Хьюбера - хорошее решение. Вот несколько более простая альтернатива.

<DataGridTemplateColumn Header="Heading">
    <DataGridTemplateColumn.CellTemplate >
        <DataTemplate>
            <TextBlock Text="{Binding SomeData}" 
                Foreground="{Binding SomeData, Converter={StaticResource TimestampToColorConverter}}" />
       </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
0 голосов
/ 25 июня 2010

Так как вы привязали к DataGrid, нет необходимости в «Binding» в DataGridTextColumn и ConverterParameter, так как конвертер не использует этот параметр.Попробуйте ниже

<toolkit:DataGridTextColumn  Header="Prüfdatum" Foreground="{Binding Path=Prüfdatum, Converter={StaticResource TimestampToColorConverter}}" />
...