Как получить текущее значение ячейки в привязке GridView - PullRequest
0 голосов
/ 24 мая 2018

Проведя последние несколько часов с этой довольно простой проблемой, я пока не нашел способа сделать это.Я использую GridView для отображения некоторых данных, и мне нужно выполнить некоторые настройки значений ячеек с помощью конвертера.Вот соответствующий XAML:

<ListView ItemsSource="{Binding SomeDataTable}">
  <ListView.View>
    <GridView>
      <GridViewColumn>
        <GridViewColumn.CellTemplate>
          <DataTemplate>
            <TextBlock Text="{Binding Path=XXX, Converter={StaticResource MyConverter}}" />
          </DataTemplate>
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
    </GridView>
  </ListView.View>
</ListView>

Что мне нужно написать вместо XXX выше?

NB Я не могу поставить постоянное имя столбца здесь, потому что этот DataTemplate должен использоваться всемистолбцы GridView.Мне нужен способ сослаться на текущее значение ячейки так же, как работает шаблон по умолчанию GridView при использовании DisplayMemberBinding.

Я нашел соответствующий пост здесь , но этотакже не имеет никакого рабочего ответа.

1 Ответ

0 голосов
/ 24 мая 2018

Одним из вариантов является использование DisplayMemberBinding для создания GridViewColumns, а затем для определения стиля вашего TextBlock как ресурса вашего ListView и использования там конвертера.

Учитывая сценарий, в котором у меня есть список лиц иЯ хочу покрасить все ячейки в зависимости от возраста человека:

Элемент данных:

public class Person
{
    public int Age { get; set; }
    public string Name { get; set; }

    public Person(int age, string name)
    {
        Age = age;
        Name = name;
    }
}

Создание столбцов в XAML:

        <ListView.View>
            <GridView>
                <GridViewColumn DisplayMemberBinding="{Binding Age}"  />
                <GridViewColumn DisplayMemberBinding="{Binding Name}"  />
            </GridView>
        </ListView.View>

Конвертер, который меняет фон ячейки в зависимости от возраста:

public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if ((int) value < 20)
        {
            return Brushes.LightBlue;
        }

        return Brushes.LightGreen;
    }

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

Использование конвертера:

        <ListView.Resources>
            <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}">
                <Setter Property="Background">
                    <Setter.Value>
                        <Binding Path="Age">
                            <Binding.Converter>
                                <local:MyConverter/>
                            </Binding.Converter>
                        </Binding>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.Resources>

Результат:

Converter and GridViewColumn

Полный XAML:

    <ListView x:Name="MyItems" Loaded="MyItems_OnLoaded">
        <ListView.Resources>
            <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}">
                <Setter Property="Background">
                    <Setter.Value>
                        <Binding Path="Age">
                            <Binding.Converter>
                                <local:MyConverter/>
                            </Binding.Converter>
                        </Binding>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.Resources>
        <ListView.View>
            <GridView>
                <GridViewColumn DisplayMemberBinding="{Binding Age}"  />
                <GridViewColumn DisplayMemberBinding="{Binding Name}"  />
            </GridView>
        </ListView.View>
    </ListView>
...