当DataGrid元素被分组时,会触发ComboBox的SelectionChanged

时间:2013-08-06 11:12:29

标签: wpf datagrid combobox grouping selectionchanged

在我的DataGrid中,我在DataGridTemplateColumn中有一个ComboBox,我想对SelectionChanged事件做出反应。我的XAML:

<DataGrid ItemsSource="{Binding}" SelectionChanged="dataGrid1_SelectionChanged" 
    SelectionMode="Single" Name="dataGrid1" ...>
    <DataGrid.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type GroupItem}">
                                <Expander Name="exp" IsExpanded="True">
                                    <Expander.Header>
                                        <TextBlock Text="{Binding SelectedValue, 
                                            ElementName=groupCB}"/>
                                    </Expander.Header>
                                    <Expander.Content>
                                        <ItemsPresenter/>
                                    </Expander.Content>
                                </Expander>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </DataGrid.GroupStyle>

    <DataGrid.Columns>
        <DataGridTemplateColumn Header="status" ...>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding Path=StatusL, RelativeSource={
                        RelativeSource Mode=FindAncestor, AncestorType={
                        x:Type Window}}}" SelectedItem="{Binding Status}" 
                        Name="statusCB" SelectionChanged="StatusCB_SelectionChanged" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        ...
    </DataGrid.Columns>
</DataGrid>

ComboBox的SelectionChanged-Method:

private void StatusCB_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // do something
}

DataGrids DataContext是DataTable的CollectionView。要对DataGrid行进行分组,请使用以下代码:

DataTable _record_data = new DataTable("records");
CollectionView _records_view = (CollectionView)CollectionViewSource.GetDefaultView(_record_data);
dataGrid1.DataContext = _records_view;

PropertyGroupDescription _group_description = new PropertyGroupDescription(groupCB.SelectedValue.ToString()); // groupCB is another ComboBox

_records_view.GroupDescriptions.Clear();
_records_view.GroupDescriptions.Add(_group_description);

当一个新行插入DataGrid时,将调用该行的ComboBox的SelectionChanged方法。当我更改ComboBox行的选定项目时,我想重新组合DataGrid。但是在regroup方法中添加新的GroupDescription会调用每一行的SelectionChanged方法。这以无限循环结束。

我希望我能解释一下我的问题。

非常感谢您的帮助

1 个答案:

答案 0 :(得分:3)

您可以更改事件处理程序以处理DropDownClosed而不是SelectionChanged

<ComboBox DropDownClosed="ComboBox_DropDownClosed" ... />

private void ComboBox_DropDownClosed(object sender, EventArgs e)
{
    //do something
}

这仅在用户关闭下拉弹出窗口时执行。请注意,如果DropDownClosed选择相同的项目或索引,则会执行SelectionChanged,而{{1}}仅在“更改”时执行