2015-04-27 5 views
0

моя цель - реализовать datagrid с столбцами combobox, где пользователь может выбрать один щелчок мышью. У меня есть проблемы с этим вопросом, и я нашел довольно много решений (here, или here), который отлично работает, UNTIL пользователь расширяет combobox в столбце один, а затем выбирает combobox в столбце 2. Проблема в том, что при первом щелчке первый combobox просто теряет фокус и только после второго щелчка мыши добавляется другое поле со списком. Но это нужно сделать одним щелчком мыши.Как открыть comboBoxColumn с одним щелчком мыши

В принципе, 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> 

и вот текущая реализация одного режима нажмите редактирования:

private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var cell = sender as DataGridCell; 
     GridColumnFastEdit(cell, e); 
    } 

    private void GridColumnFastEdit(DataGridCell cell, RoutedEventArgs e) 
    { 
     if (cell == null || cell.IsEditing || cell.IsReadOnly) 
      return; 

     var dataGrid = grid; 
     if (dataGrid == null) 
      return; 

     if (!cell.IsFocused) 
     { 
      cell.Focus(); 
     } 

     var cb = cell.Content as ComboBox; 
     if (cb == null) return; 
     grid.BeginEdit(e); 
     cell.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { })); 
     cb.IsDropDownOpen = true; 
    } 
+0

попытался с помощью TemplateColumn с шаблоном редактирования как выпадающий список и установить в режиме редактирования по щелчку? – Muds

+0

Спасибо за ответ, Я попробовал ваше предложение, но мне еще нужно нажать второй раз, если текущее поле со списком будет расширено. – user3046346

+0

для этого ---- это должно работать .... private void UIElement_OnPreviewMouseLeftButtonUp (object sender, MouseButtonEventArgs e) { combo.IsDropDownOpen =! Combo.IsDropDownOpen; } – Muds

ответ

0

Перемещено от комментариев -

Вы пробовали использовать TemplateColumn с шаблоном редактирования как combobox и установить в режиме редактирования при нажатии?

После этого, чтобы получить комбо открытия в один клик ниже должен работать ..

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

Это работает, частично. Он открывает комбо, даже предыдущий был расширен. Проблема заключается в том, что при нажатии кнопки мыши она автоматически сбрасывает поле со списком и это не обычное поведение. – user3046346

+0

не получил? для меня он закрывает предыдущую комбо и открывает новый за один клик, не так ли это для вас? – Muds

+0

на кнопке мыши вверх не следует закрывать комбо. Пользователь должен иметь возможность выпускать кнопку в любом месте пользовательского интерфейса, а комбо должно быть расширено. Но это не происходит на каждой кнопке мыши, она просто закрывает комбо. – user3046346

Смежные вопросы