2016-02-24 3 views
0

Моя общая цель состоит в том, чтобы иметь WPF DataGrid, который будет показывать мои данные в обычном режиме, но при редактировании имеет ComboBox с возможными значениями для этого конкретного столбца.Настройка ItemsSource на ComboBox в DataTemplate

Так, например, у меня есть следующие данные в моем DataGrid

|    Name |    Work Date | Clock In | Clock Out | Job | Hours | 
|------------------|-------------------------|----------|-----------|--------|-------| 
| Edaurdo Gutierez |Friday February 12, 2016 | 1:06 PM | 9:00 PM | Server | 8.00 | 
| Rubisel Lozano |Friday February 12, 2016 | 12:55 PM | 8:59 PM | Server | 8.00 | 
|  Paul Burks |Friday February 12, 2016 | 8:59 AM | 5:30 PM | Chef | 8.50 | 
| Roberto Agular |Friday February 12, 2016 | 8:30 AM | 4:10 PM | Chef | 7.75 | 

Я хочу, чтобы иметь возможность дважды щелкнуть ячейку и отредактировать его значение, но шаблон для редактирования будет отличаться с каждым из столбцов , Мне нужно сделать это для Рабочего дня, Часы, Часы и Работа.

У меня есть стол рабочей даты, работающий по назначению, но это проще, потому что он заполняет DatePicker для меня. Для столбца Job я просто получаю пустой ComboBox, потому что я не знаю, как установить его в ItemsSource. Вот некоторые из кода, который делает функцию столбца «Дата работы».

XAML

<UserControl.Resources> 
    <DataTemplate x:Key="tmpDate"> 
     <TextBlock Text="{Binding Path = Date, StringFormat = '{}{0:dddd MMMM dd, yyyy}'}" /> 
    </DataTemplate> 
    <DataTemplate x:Key="tmpDateEdit"> 
     <DatePicker SelectedDate="{Binding Path = Date}"/> 
    </DataTemplate> 
</UserControl.Resources> 

C#

private void gridTimeSheet_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
    { 
     DataGridColumn col = e.Column; 

     if (col.Header.ToString() == "Date") 
     { 
      DataGridTemplateColumn tmpCol = new DataGridTemplateColumn(); 
      tmpCol.CellTemplate = (DataTemplate)FindResource("tmpDate"); 
      tmpCol.CellEditingTemplate = (DataTemplate)FindResource("tmpDateEdit"); 
      tmpCol.Header = "Date"; 
      e.Column = tmpCol; 
     } 
    } 

Так что мой вопрос, как я могу сделать работу колонки Работа подобным образом, так что, когда я дважды щелкните для редактирования ячейки, ComboBox возможных значений для Джобса? То, как я хочу заполнить этот ComboBox, будет через DataTable, созданный из SQL-запроса.

Я открыт для любых предложений. Возможно, DataTemplate не является моим лучшим вариантом для выполнения этих столбцов. Любые рекомендации приветствуются.

Спасибо!

ответ

0

Это верная проблема.

Я думаю, что ваш поиск связан с RelativeSource. Например, вы могли бы сделать это в DataGrid выглядеть примерно так:

<DataGrid> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <ComboBox SelectedItem="{Binding Date}" ItemsSource="{Binding DataContext.DateList, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellEditingTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Проблема ваша текущая строка не имеет список, чтобы заполнить ваш выпадающий. Я предполагаю, что они хранятся в другом месте в вашей ViewModel. Поэтому для ссылки на него вам нужна ссылка на ваш ViewModel, что и связано с RelativeSource. Затем вы можете связать свою коллекцию, в этом случае DateList.

+0

Я довольно новичок в этом, поэтому я никогда раньше не использовал модель представления. Я посмотрю, как это работает, и это должно работать на меня. Благодаря! –

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