简体   繁体   English

将DataGrid绑定到ObservableCollection <T> 在WPF中

[英]Bind a DataGrid to an ObservableCollection<T> in WPF

How can I bind a Datagrid with two columns ( DataGridTextColumn and DataGridComboBoxColumn ) to an ObservableCollection<Team> Teams ? 如何将具有两列( DataGridTextColumnDataGridComboBoxColumn )的Datagrid绑定到ObservableCollection<Team> Teams

The DataGridTextColumn is bound correctly. DataGridTextColumn已正确绑定。 But nothing is displayed in DataGridComboBoxColumn . 但是在DataGridComboBoxColumn什么也不显示。

Code-behind 后台代码

   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 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>

Your need to setup DataContext property of your control with instance of ViewModel. 您需要使用ViewModel实例设置控件的DataContext属性。 Like, in control constructor 就像在控件构造函数中一样

this.DataContext = new ViewModel();

and fill DisplayMemberPath in your XAML 并在XAML中填充DisplayMemberPath

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

UPDATE UPDATE

I was inccorrect. 我不正确。 Because DataGridComboboxColumn does not inherit DataContext, to do what you want you have to do in following way: 因为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>

Just use "DataGridTemplateColumn". 只需使用“ DataGridTemplateColumn”即可。 Dont forget to add a selectedItem Member. 不要忘记添加selectedItem成员。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM