【问题标题】:How to get current cell value in GridView binding如何在 GridView 绑定中获取当前单元格值
【发布时间】:2018-11-02 23:51:48
【问题描述】:

过去几个小时一直在解决这个相当简单的问题,但我还没有找到解决方法。我正在使用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?

注意我不能在此处放置常量列名,因为此 DataTemplate 将由 GridView 的所有列使用。我需要一种方法来引用 当前单元格值,就像使用 DisplayMemberBinding 时 GridView 的默认模板的工作方式一样。

我找到了一个相关的帖子here,但也没有任何有效的答案。

【问题讨论】:

  • 你尝试了什么?
  • @ShloimeRosenblum:很多。包括尝试编写我在上面发布的单元格模板以及编写我自己的模板选择器。没有明显的方法来获取当前单元格值。

标签: wpf xaml binding datatemplate


【解决方案1】:

一种选择是使用 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>

结果:

完整的 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多