如何将组合框添加到Datagrid中的所有ColumnHedares,除了wpf中的第一列?

时间:2013-05-23 14:13:41

标签: c# wpf datagrid combobox datagridcolumnheader

我有一个数据网格,我用Comboboxes替换了标题。我通过在wpf中使用下面的代码来完成这部分工作,但我的问题是我不想让第一个列标题的组合框。

我试过这种方式:

<DataGrid.ColumnHeaderStyle>
                <Style TargetType="{x:Type DataGridColumnHeader}">
                    <EventSetter Event="Click" Handler="ColumnHeaderClick" />
                    <Style.Triggers>
                        <DataTrigger Value="True">
                            <DataTrigger.Binding>
                                <MultiBinding Converter="{StaticResource ColumnHeaderToComboBoxConverter}">
                                    <Binding Path="ColumnHeader"/>
                                    <Binding Path="DataContext.FirstColumnHeader" ElementName="control" />
                                </MultiBinding>
                            </DataTrigger.Binding>
                            <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>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.ColumnHeaderStyle>

多重绑定部分中,我想向转换器发送2个值:

作为我尝试发送当前列标题的第一个值:

<Binding Path="ColumnHeader"/>

每次我发送第一个列标题的特定值时,作为第二个值:

<Binding Path="DataContext.FirstColumnHeader" ElementName="control" />

我想在转换器中比较这两个,如果它们相同则返回false,否则它应该返回true(这意味着将组合框添加到列标题中)。 但 不会将任何信息发送到名为ColumnHeaderToComboBoxConverter的转换器。

任何帮助都将不胜感激。enter image description here

我也附上了一张图片。

2 个答案:

答案 0 :(得分:1)

您可以将第一个列标题样式设置为null,因此此样式不会影响它:

风格:

 <DataGrid.ColumnHeaderStyle>
     <Style TargetType="{x:Type DataGridColumnHeader}">
        <Setter Property="ContentTemplate">
          <Setter.Value>
            <DataTemplate>
              <ComboBox ItemsSource="{Binding DataContext.ArticleAttributes, Source={x:Reference control}}"/>
            </DataTemplate>
           </Setter.Value>
         </Setter>
     </Style>
 </DataGrid.ColumnHeaderStyle>

列定义:

    <DataGrid.Columns>
       <DataGridTextColumn Binding="{Binding ID}" Header="ID" HeaderStyle="{x:Null}"/>
       <DataGridTextColumn Binding="{Binding Name}" Header="Name" />
       <DataGridTextColumn Binding="{Binding Age}" Header="Age"/>
   </DataGrid.Columns>

<强>的AutoGenerateColumns

如果您的列是由dataGrid生成的,您可以向AutoGeneratingColumn事件添加一个事件处理程序,然后将该列设置为null,这将是第一个调用中的第一列,然后删除处理程序:

添加处理程序:

dataGrid.AutoGeneratingColumn += DataGrid_AutoGeneratingColumn;

处理程序:

   private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        e.Column.HeaderStyle = null;
        dataGrid.AutoGeneratingColumn -= DataGrid_AutoGeneratingColumn;
    }

答案 1 :(得分:0)

你检查过DataTemplateSelector吗?您可以选择其他DataTemplate ...

检查: http://msdn.microsoft.com/en-us/library/ms742521.aspx

此致