Можно ли немедленно выставить DataGridComboBoxColumn? - PullRequest
4 голосов
/ 09 августа 2011

Можно ли "выставить" DataGridComboBoxColumn таблицы данных WPF Toolkit при загрузке таблицы данных? По умолчанию вы должны щелкнуть в ячейке, чтобы открыть поле со списком. Я бы хотел, чтобы пользователь увидел, что поле со списком доступно без необходимости щелкать по ячейке. Я предпочел бы, чтобы поле со списком было немедленно доступно, и первый щелчок в ячейке заставляет поле со списком фактически выпадать. В настоящее время вы должны щелкнуть ячейку, а затем щелкнуть раскрывающееся поле со списком, чтобы отобразить значения.

Unwanted appearance

* 1006 В.С. *

Correct appearance

XAML:

<dg:DataGridComboBoxColumn x:Name="ctrlStatus" Header="Status" Width="Auto" SelectedValueBinding="{Binding Port}" SelectedValuePath="Status">
  <dg:DataGridComboBoxColumn.CellStyle>
    <Style TargetType="dg:DataGridCell">
      <EventSetter Event="Selector.SelectionChanged" Handler="SelectionChanged"/>
    </Style>
  </dg:DataGridComboBoxColumn.CellStyle>
</dg:DataGridComboBoxColumn>

Код позади:

List<string> _statusList;
public List<string> StatusList
{
  get 
  {
      return _statusList; 
  }
  set
  {
    _statusList = value;
    ctrlStatus.ItemsSource = _statusList;
  }
}

Спасибо, GAR8

Окончательное решение: XAML

<telerik:GridViewComboBoxColumn Header="Status">
  <telerik:GridViewComboBoxColumn.CellTemplate>
    <DataTemplate>
      <telerik:RadComboBox ItemsSource="{Binding StatusList,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}" SelectedValue="{Binding Port}" SelectedValuePath="Status" SelectionChanged="SelectionChanged"/>
    </DataTemplate>
  </telerik:GridViewComboBoxColumn.CellTemplate>
</telerik:GridViewComboBoxColumn>

Код сзади:

List<string> _statusList;
public List<string> StatusList 
{
  get { return _statusList;  }
  set { _statusList = value; }
}

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Попробуйте это

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
       <DataTemplate>
           <ComboBox ItemsSource=”{Binding Path=YourSource...}” 
         Text=”{Binding Path=YourSource...}”/>
       </DataTemplate>
       </DataGridTemplateColumn.CellTemplate>
       <DataGridTemplateColumn.CellEditingTemplate >
       <DataTemplate>
         <ComboBox ItemsSource=”{Binding Path=YourSource...}” 
         Text=”{Binding Path=YourSource...}”/>
       </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

По сути, вы определяете ComboBox в обоих случаях: CellTemplate и CellEditingTemplate.

См. Этот пост , который я написал некоторое время назад, в котором я написал отдельный шаблон для отсутствия редактирования (которое вы видите вначале) и редактирования (которое вы видите, когда вы нажимаете i.e combobox) состояния ячейки. Теперь вы можете скопировать код редактирования без редактирования, как я делал в XAML выше, и ваша проблема будет решена

1 голос
/ 09 августа 2011

Вы можете использовать DataGridTemplateColumn и разместить ComboBox в качестве шаблона редактирования ячейки, не указывая шаблон без редактирования.Это позволит DataGrid всегда использовать ComboBox.

Обновление
Как указано в вашем комментарии, ниже пример.Обратите внимание, что пример не является оптимальным, и я бы выбрал другой дизайн, но я сделал это таким образом, чтобы он мог интегрироваться в ваше решение без больших проблем.Я не проверял это.Оставьте комментарий, если они содержат ошибки.

<DataGridTemplateColumn>    
     <DataGridTemplateColumn.CellEditingTemplate >       
           <DataTemplate>         
                 <ComboBox x:Name="ctrlStatus" 
                        SelectedValueBinding="{Binding Port}" 
                        SelectedValuePath="Status">  
                        SelectionChanged="SelectionChanged"
                        ItemsSource="{Binding StatusList,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}" 
                  />       
           </DataTemplate>    
     </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

Чтобы использовать приведенный выше код, StatusList должен реализовать уведомление об изменении.Если ваша DataGrid находится не в aWindow, а в другом классе, например в UserControl, замените имя типа в относительном источнике.

...