直接绑定到 DataGrid 列

Direct Binding on DataGrid Column

我有以下DataGrid

<DataGrid x:Name="CommentaryGrid"
          ...
          SelectedItem="{Binding SelectedCommentary, Mode=TwoWay}"
          ItemsSource="{Binding CommentaryCollection}"
          Helpers:DataGridTextSearch.SearchValue="{Binding ElementName=SearchTextBox, Path=Text, UpdateSourceTrigger=PropertyChanged}">
<DataGrid.Columns>
    <DataGridTextColumn Header="Event ID" IsReadOnly="True" Binding="{Binding event_id}"/>
    <DataGridTextColumn Header="Team" IsReadOnly="True" Binding="{Binding team, Converter={StaticResource NullTeamToBlankStringConverter}}"/>
    <DataGridTextColumn Header="Bookie" IsReadOnly="True" Binding="{Binding bookie}"/>
    <DataGridTextColumn Header="Type" IsReadOnly="True" Binding="{Binding type}"/>
    <DataGridTextColumn Header="Value" IsReadOnly="True" Binding="{Binding value}"/>
    ...

CommentaryCollection 通过

定义
public ObservableCollection<Taurus.Commentary> CommentaryCollection { ... }

我不仅需要显示对象的 Taurus.Commentary.team 属性,而且首先要测试另一个 属性 的条件(使用我的 NullTeamToBlankStringConverter)。所以我想将整个 Taurus.Commentary 对象传递给我的列绑定。我可以将列定义更改为

<DataGridTextColumn Header="Team" IsReadOnly="True" Binding="{Binding Path=Items, ElementName=CommentaryGrid, Converter={StaticResource NullTeamToBlankStringConverter}}"/>

绑定到 ItemCollection,但这并不能让我测试每一行中的对象(使用我的转换器)。在使用 ItemCollection 方法的转换器中,我可以转换为 ItemCollection 并检查 CurrentItem 但这只会给我选定的项目,因此所有行的值都相同。如何绑定到 ItemSource 的整个 Taurus.Commentary 项?

感谢您的宝贵时间。

使用 Binding Path=. 绑定到整个数据上下文(对于项目模板,即集合中的项目)。

在你的情况下,它看起来像:

Binding="{Binding Path=., Converter={StaticResource NullTeamToBlankStringConverter}}"/>

使用IMultiValueConverter并将当前对象绑定作为第二个参数传递。

<DataGridTextColumn>
    <DataGridTextColumn.Binding>
        <MultiBinding Converter="{StaticResource NullTeamToBlankStringConverter}">
            <Binding Path="Items" ElementName="CommentaryGrid"/>
            <Binding Path="."/>
        </MultiBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>

NullTeamToBlankStringConverter 需要实现 IMultiValueConverter 而不是 IValueConverter。