1

我有一个数据网格,我用组合框替换了标题。我通过在 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>

Multibinding部分,我想向转换器发送 2 个值:

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

<Binding Path="ColumnHeader"/>

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

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

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

任何帮助将不胜感激。在此处输入图像描述

我还附上了一张图片。

4

2 回答 2

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>

自动生成列

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

添加处理程序:

dataGrid.AutoGeneratingColumn += DataGrid_AutoGeneratingColumn;

处理程序:

   private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        e.Column.HeaderStyle = null;
        dataGrid.AutoGeneratingColumn -= DataGrid_AutoGeneratingColumn;
    }
于 2013-05-23T14:31:04.337 回答
0

你检查过 DataTemplateSelector 吗?您可以选择不同的数据模板...

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

问候,

于 2013-05-23T14:20:31.167 回答