直接绑定到 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。
我有以下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。