【问题标题】:Bind a DataGrid to an ObservableCollection<T> in WPF将 DataGrid 绑定到 WPF 中的 ObservableCollection<T>
【发布时间】:2017-02-08 19:12:07
【问题描述】:

如何将具有两列(DataGridTextColumnDataGridComboBoxColumn)的 Datagrid 绑定到 ObservableCollection&lt;Team&gt; 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>

【问题讨论】:

  • 你有视图集的DataContext吗?否则它看起来很好。
  • @StephenWilson 是的,我已经设置好了。

标签: c# wpf data-binding datagrid datacontext


【解决方案1】:

您需要使用 ViewModel 实例设置控件的 DataContext 属性。比如,在控制构造函数中

this.DataContext = new ViewModel();

并在 XAML 中填写 DisplayMemberPath

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

更新

我错了。因为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>

【讨论】:

  • 你能帮我处理 DisplayMemberPath 吗?
  • 还是不行!仅显示 DataGridTextColumn!我遇到了 DataGridComboBoxColumn 的问题。
  • @Vahid 更新答案
  • 谢谢其实我已经想出了这个答案搜索。现在组合框已填充,但如何显示选定的索引。我想默认显示第一个元素!
  • 如果你想使用 SelectedIndex 或 SelectedItem,你应该将它添加到你的视图模型中并初始化内部视图模型,然后绑定到 Column。
【解决方案2】:

只需使用“DataGridTemplateColumn”。 不要忘记添加 selectedItem 成员。

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

【讨论】:

  • 谢谢 Rom,你能告诉我如何添加 selectedItem 绑定吗?我只想显示第一个索引。
  • 1.添加选定的属性: public class Team { public string Name { get;放; } 公共字符串 SelectedMember { 获取;放; } public List 成员 { get;放; } } 2. Name = "A", Members = new List {"John", "Jack"},SelectedMember = "John" 3.
猜你喜欢
  • 2013-10-14
  • 1970-01-01
  • 2014-08-23
  • 2016-08-28
  • 2015-01-26
  • 2015-04-02
  • 2013-09-07
  • 2017-04-16
相关资源
最近更新 更多