【问题标题】:Direct Binding on DataGrid Column直接绑定 DataGrid 列
【发布时间】:2015-03-10 00:35:12
【问题描述】:

我有以下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 Item?

感谢您的宝贵时间。

【问题讨论】:

    标签: c# wpf mvvm binding datagrid


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢您的宝贵时间。这是我寻求的解决方案。我的情况似乎不需要MultiValueConverter
    • @Killercam 是的,除非您出于某种原因还需要该系列,否则不会是这样
    • 非常感谢您的帮助。
    【解决方案2】:

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

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

    NullTeamToBlankStringConverter 需要实现 IMultiValueConverter 而不是 IValueConverter。

    【讨论】:

    • 非常感谢。最受赞赏。
    • 我认为您的算法需要 Items 集合和当前对象,但如果您只对当前对象实例感兴趣,那么 BradleyDotNET 建议的 IValueConverter 是一种可行的方法。
    • 非常感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2014-08-13
    • 2013-08-06
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多