簡體   English   中英

將DataGrid綁定到ObservableCollection <T> 在WPF中

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

如何將具有兩列( DataGridTextColumnDataGridComboBoxColumn )的Datagrid綁定到ObservableCollection<Team> Teams

DataGridTextColumn已正確綁定。 但是在DataGridComboBoxColumn什么也不顯示。

后台代碼

   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>

您需要使用ViewModel實例設置控件的DataContext屬性。 就像在控件構造函數中一樣

this.DataContext = new ViewModel();

並在XAML中填充DisplayMemberPath

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

UPDATE

我不正確。 因為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>

只需使用“ DataGridTemplateColumn”即可。 不要忘記添加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