2016-09-30 3 views
1

Как я могу свяжите Datagrid с двумя столбцами (DataGridTextColumn и DataGridComboBoxColumn) к ObservableCollection<Team> Teams?Привязка DataGrid к ObservableCollection <T> в WPF

DataGridTextColumn связан правильно. Но ничего не отображается в DataGridComboBoxColumn.

Code-за

public class Team 
    { 
     public string Name { get; set; } 
     public List<string> Members { get; set; } 
    } 

    public class ViewModel : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     private ObservableCollection<Team> teams = new ObservableCollection<Team> 
     { 
     new Team() 
     { 
      Name = "A", Members = new List<string> {"John", "Jack"}, 
     }, 
     new Team() 
     { 
      Name = "B", Members = new List<string> {"Sarah", "Anna"}, 
     } 
     }; 
     public ObservableCollection<Team> Teams 
     { 
     get { return teams; } 
     set 
     { 
      teams = value; 
      RaisePropertyChanged("Teams"); 
     } 
     } 

     private void RaisePropertyChanged(string propertyName) 
     { 
     var handler = PropertyChanged; 
     if (handler == null) return; 

     handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

XAML

<DataGrid ItemsSource="{Binding Path=Teams}" 
      AutoGenerateColumns="False"> 
    <DataGrid.Columns> 

     <DataGridTextColumn Header="Team" 
            IsReadOnly="True" 
            Width="*" 
            Binding="{Binding Name}"/> 

     <DataGridComboBoxColumn Header="Members" 
             Width="*" 
             /> 

    </DataGrid.Columns> 
</DataGrid> 
+0

У вас есть DataContext для представления? В противном случае это выглядит хорошо. –

+0

@ StephenWilson Да, я это установил. – Vahid

ответ

2

Просто используйте «DataGridTemplateColumn». Не забудьте добавить выбранного пользователя.

  <DataGridTemplateColumn Header="Members"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate DataType="wpfApplication1:Team"> 
         <ComboBox ItemsSource="{Binding Members}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
+0

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

+0

1. Добавить выбранное свойство: public class Team { public string Имя {get; задавать; } public string SelectedMember {get; задавать; } public List Участники {get; задавать; } } 2. Name = "A", Members = new List {"John", "Jack"}, SelectedMember = "John" 3. Rom

+1

Большое спасибо. – Vahid

3

Ваша потребность в установке DataContext свойство элемента управления с экземпляром ViewModel. Как, в управляющем конструктор

this.DataContext = new ViewModel(); 

и заполнить DisplayMemberPath в вашем XAML

<DataGridTextColumn Header="Team" DisplayMemberPath="Name" ... 

UPDATE

Я был inccorrect. Поскольку DataGridComboboxColumn не наследует DataContext, чтобы делать то, что вы хотите, вы должны сделать в следующем виде:

<DataGrid ItemsSource="{Binding Path=Teams}" 
     AutoGenerateColumns="False"> 
     <DataGrid.Columns> 

      <DataGridTextColumn Header="Team" 
           IsReadOnly="True" 
           Width="*" 
           Binding="{Binding Name}" /> 

      <DataGridComboBoxColumn Header="Members" 
            Width="*" 
            > 

       <DataGridComboBoxColumn.ElementStyle> 
        <Style TargetType="ComboBox"> 
         <Setter Property="ItemsSource" Value="{Binding Path=Members}" /> 
        </Style> 
       </DataGridComboBoxColumn.ElementStyle> 

       <DataGridComboBoxColumn.EditingElementStyle> 
        <Style TargetType="ComboBox"> 
         <Setter Property="ItemsSource" Value="{Binding Path=Members}" /> 
        </Style> 
       </DataGridComboBoxColumn.EditingElementStyle> 
      </DataGridComboBoxColumn> 

     </DataGrid.Columns> 
    </DataGrid> 
+0

Я уже установил это. – Vahid

+0

Можете ли вы мне помочь с DisplayMemberPath? – Vahid

+0

уже сделано в редакциях :) – tym32167

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