在我的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方法。这以无限循环结束。
我希望我能解释一下我的问题。
非常感谢您的帮助
答案 0 :(得分:3)
您可以更改事件处理程序以处理DropDownClosed
而不是SelectionChanged
<ComboBox DropDownClosed="ComboBox_DropDownClosed" ... />
private void ComboBox_DropDownClosed(object sender, EventArgs e)
{
//do something
}
这仅在用户关闭下拉弹出窗口时执行。请注意,如果DropDownClosed
选择相同的项目或索引,则会执行SelectionChanged
,而{{1}}仅在“更改”时执行