C# 如何通过单击打开comboBoxColumn

C# 如何通过单击打开comboBoxColumn,c#,.net,wpf,datagrid,combobox,C#,.net,Wpf,Datagrid,Combobox,我的目标是实现一个带有组合框列的datagrid,用户可以在其中单击鼠标进行选择。 我在谷歌上搜索了这个问题,找到了很多解决方案,或者说效果很好,直到用户在第一列中展开combobox,然后在第二列中选择combobox。问题是,第一次单击时,第一个组合框会失去焦点,只有在第二次单击后,其他组合框才会展开。但是,它需要在一次点击中完成 基本上,XAML看起来像: <DataGrid Name="grid" SelectionMode="Extended" HeadersVisibilit

我的目标是实现一个带有组合框列的datagrid,用户可以在其中单击鼠标进行选择。 我在谷歌上搜索了这个问题,找到了很多解决方案,或者说效果很好,直到用户在第一列中展开combobox,然后在第二列中选择combobox。问题是,第一次单击时,第一个组合框会失去焦点,只有在第二次单击后,其他组合框才会展开。但是,它需要在一次点击中完成

基本上,XAML看起来像:

 <DataGrid Name="grid" SelectionMode="Extended" HeadersVisibility="Column" SelectionUnit="Cell" >
    <DataGrid.Columns>
        <DataGridComboBoxColumn Header="Name" Width="*" SelectedItemBinding="{Binding Path=Entity}" DisplayMemberPath="EntityName" >
            <DataGridComboBoxColumn.ElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding Path=Entities}"/>
                </Style>
            </DataGridComboBoxColumn.ElementStyle>
            <DataGridComboBoxColumn.EditingElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding Path=Entities, Mode=TwoWay}"/>                                                        
                    <Setter Property="Uid" Value="cbEntMapping"/>
                    <EventSetter Event="SelectionChanged" Handler="CbFirmChanged" />
                </Style>                                                    
            </DataGridComboBoxColumn.EditingElementStyle>
            <DataGridComboBoxColumn.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown" />                                                       
                </Style>                                                    
            </DataGridComboBoxColumn.CellStyle>
        </DataGridComboBoxColumn>
        <DataGridComboBoxColumn Header="Give Up" 
            Width="*"
            SelectedItemBinding="{Binding Path=GiveUp}"
            DisplayMemberPath="EntityName">
            <DataGridComboBoxColumn.ElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding Path=GiveUp}"/>

                </Style>
            </DataGridComboBoxColumn.ElementStyle>
            <DataGridComboBoxColumn.EditingElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding Path=GiveUp, Mode=TwoWay}"/>
                    <EventSetter Event="SelectionChanged" Handler="CbFirmChanged" />                                                        
                    <Setter Property="Uid" Value="cbEntMapping"/>
                </Style>
            </DataGridComboBoxColumn.EditingElementStyle>
            <DataGridComboBoxColumn.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown" />
                </Style>
            </DataGridComboBoxColumn.CellStyle>
        </DataGridComboBoxColumn>
    </DataGrid.Columns>
</DataGrid>
从评论中删除-


您是否尝试过将templatecolumn与edit template一起用作组合框,并在单击时设置为编辑模式

在此之后,要在单击中打开组合,请执行以下操作

private void UIElement_OnPreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
     combo.IsDropDownOpen = !combo.IsDropDownOpen; 
} 

尝试使用templatecolumn,将编辑模板作为组合框,并在单击时设置为编辑模式?感谢您的回复,我尝试了您的建议,但如果当前组合框已展开,我仍必须再次单击。为此,这应该可以工作。。。。private void UIElement_on PreviewMouseLeftButtonUpoObject发送方,MouseButtonEventArgs e{combo.IsDropDownOpen=!combo.IsDropDownOpen;}添加了格式化答案..部分有效。它甚至可以打开以前扩展的组合。问题是,当鼠标按下时,它会自动折叠组合框,这不是一种常见的行为?对我来说,它关闭了以前的组合,并在一次点击中打开了新的组合,这对你来说不一样吗?在鼠标按钮向上时,它不应该关闭组合。用户应该能够在UI的任何位置释放按钮,并且组合框仍然可以展开。但这并不是在每个鼠标按钮上都发生的,它只是关闭组合框。那么它应该什么时候关闭?它应该像普通组合框一样工作,所以在选择或单击外部某处后关闭。在这种情况下,它应该保留旧值。
private void UIElement_OnPreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
     combo.IsDropDownOpen = !combo.IsDropDownOpen; 
}