1

在此处输入图像描述

我有一个 DataGrid,它使用 Itemsources 属性填充了一个 DataTable,这意味着所有列和行都是自动创建的。我需要在我的网格中的每个列标题单元格中添加一个组合框。

我已经使用这段代码完成了那部分:

<DataGrid Grid.Row="1" Margin="0 5 0 0" ItemsSource="{Binding SelectedExcel}">
   <DataGrid.ColumnHeaderStyle>
         <Style TargetType="{x:Type DataGridColumnHeader}">
             <Setter Property="ContentTemplate">
                 <Setter.Value>
                     <DataTemplate Template="">
                         <ComboBox ItemsSource="{Binding DataContext.ArticleAttributes, Source={x:Reference control}}" SelectedItem="{Binding DataContext.SelectedArticleAttribute, Source={x:Reference control}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                     </DataTemplate>
                 </Setter.Value>
             </Setter>
         </Style>
   </DataGrid.ColumnHeaderStyle>
</DataGrid>

问题是当我选择其中一个组合框中的一项时,所有组合框的值都会改变。我附上了一张图片。知道我应该如何解决这个问题吗?而且我还需要知道设置了哪一列的组合框。我需要稍后使用该列。我很清楚 DataGrid SelectedItem 和 SelectedIndex 属性,还有其他想法吗?

我试图以这种方式修复它:

<DataGrid.ColumnHeaderStyle>
                <Style TargetType="{x:Type DataGridColumnHeader}">
                    <Style.Triggers>
                        <DataTrigger Value="True">
                            <DataTrigger.Binding>
                                <MultiBinding Converter="{StaticResource MultiEquilityConverter}">
                                    <Binding RelativeSource="{RelativeSource Self}" />
                                    <Binding Path="CurrentColumn" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}" />
                                </MultiBinding>
                            </DataTrigger.Binding>
                        </DataTrigger>
                    </Style.Triggers>
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding DataContext.ArticleAttributes, Source={x:Reference control}}" SelectedItem="{Binding DataContext.SelectedArticleAttribute, Source={x:Reference control}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </DataGrid.ColumnHeaderStyle>

但是MultiEquilityConverter永远不会触发。

我已经在网上搜索了两天,但我还没有找到任何方法。

4

2 回答 2

1
SelectedItem="{Binding DataContext.SelectedArticleAttribute, Source={x:Reference control}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

网格标题中的每个 ComboBox 都SelectedItem绑定到相同的属性SelectedArticleAttribute。因此,当一个 Combo 更改 SelectedItem 时,该更改将通过绑定传播到所有组合框

不确定 DataContext 中 SelectedArticleAtribute 的用途是什么。也许您可以为每个组合框创建单独的属性并相应地绑定它们。(SelectedArticleAtribute1,SelectedArticleAttribute2,....)

于 2013-05-05T17:33:54.207 回答
1

我已经以这种方式修复了它,对于我使用了这段代码的组合框:

<DataGrid.ColumnHeaderStyle>
                <Style TargetType="{x:Type DataGridColumnHeader}">
                    <EventSetter Event="Click" Handler="ColumnHeaderClick" />
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding DataContext.ArticleAttributes, Source={x:Reference control}}">
                                    <l:Interaction.Triggers>
                                        <l:EventTrigger EventName="SelectionChanged">
                                            <l:InvokeCommandAction Command="{Binding DataContext.ArticleAttributeCommand, Source={x:Reference control}}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=SelectedItem}" />
                                        </l:EventTrigger>
                                    </l:Interaction.Triggers>
                                </ComboBox>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </DataGrid.ColumnHeaderStyle>

并以这种方式获取列号:

<EventSetter Event="Click" Handler="ColumnHeaderClick" />

正如上面已经提到的。

于 2013-05-07T15:32:02.717 回答