2013-07-02 3 views
2

Я пытаюсь создать очень простое приложение CRUD WPF. У меня есть datagrid с 2 столбцами, идентификатором и категорией. Для категории, я хочу, чтобы иметь возможность выбирать из списка при добавлении и редактировании. Вот то, что я до сих пор в XAML:WPF DataGrid DataGridTemplateColumn ComboBox ItemSource

<DataGrid Name="dataGridBudgetEntries" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" RowEditEnding="dataGridBudgetEntries_RowEditEnding"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding ID}" Header="ID" IsReadOnly="True"></DataGridTextColumn> 
     <DataGridTemplateColumn Header="Category"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding CategoryName}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <ComboBox></ComboBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellEditingTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

В коде позади, я следующее:

public MainWindow() 
{ 
    InitializeComponent(); 

    dataGridBudgetEntries.ItemsSource = FinancialManagementDatabase4ME.BLL.GetBudgetEntriesForDataGrid(); 
    List<Category> categories = FinancialManagementDatabase4ME.BLL.GetCategories(); 
} 

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

ответ

3
<DataGrid AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" ItemsSource="{Binding Entries}" RowEditEnding="dataGridBudgetEntries_RowEditEnding"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding ID}" Header="ID" IsReadOnly="True"></DataGridTextColumn> 
     <DataGridTemplateColumn Header="Category"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Category}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <ComboBox ItemsSource="{Binding Categories}"></ComboBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellEditingTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 


public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = new MyViewModel(); 
} 

public class MyViewModel : ViewModelBase 
{ 
    public MyViewModel() 
    { 
     this.Entries = FinancialManagementDatabase4ME.BLL.GetBudgetEntriesForDataGrid(); 
     this.Categories = FinancialManagementDatabase4ME.BLL.GetCategories(); 
    } 

    private ObservableCollection<BudgetEntries> entries; 
    public ObservableCollection<BudgetEntries> Entries 
    { 
     get 
     { 
      return this.entries; 
     } 

     set 
     { 
      if (value != this.entries) 
      { 
       this.entries = value; 
       this.OnPropertyChanged("Entries"); 
      } 
     } 
    } 

    private ObservableCollection<Category> categories; 
    public ObservableCollection<Category> Categories 
    { 
     get 
     { 
      return this.categories; 
     } 

     set 
     { 
      if (value != this.categories) 
      { 
       this.categories = value; 
       this.OnPropertyChanged("Categories"); 
      } 
     } 
    } 
} 

public class BudgetEntries : ViewModelBase 
{ 
    private string id; 
    public string Id 
    { 
     get 
     { 
      return this.id; 
     } 

     set 
     { 
      if (value != this.id) 
      { 
       this.id = value; 
       this.OnPropertyChanged("Id"); 
      } 
     } 
    } 

    private string category; 
    public string Category 
    { 
     get 
     { 
      return this.category; 
     } 

     set 
     { 
      if (value != this.category) 
      { 
       this.category = value; 
       this.OnPropertyChanged("Category"); 
      } 
     } 
    } 
} 
0

Вы должны наследовать INotifyPropertyChanged интерфейса в классе элемента данных (типа вы используете, чтобы дать каждую строку данных), а также использовать PropertyChangedEventHandler, чтобы иметь возможность сообщить DataGrid, какой элемент должен быть выбран в соответствии с свойство вашего типа данных, а также обновить свойство этого типа для этой строки, всякий раз, когда в выпадающем списке сделан выбор. Взгляните на эту запись в блоге под названием: WPF Datagrid Combobox Column по адресу: http://www.dylansweb.com. Это будет именно то, что вам нужно, я верю.

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