【问题标题】:How to bind a ObservableCollection of type string to Datagrid如何将字符串类型的 ObservableCollection 绑定到 Datagrid
【发布时间】:2018-01-28 06:08:02
【问题描述】:

我有一个相当简单的查询,我有一个类型为stringObservableCollection,称为投诉。现在我想将此ObservableCollection 绑定到具有两列的DataGrid:复选框模板列和包含投诉的Complaint 列。我想知道如何实现这一目标?我正在使用 MVVM。我已将DataGridItemsSource 属性设置为Complaints,但看不到数据,因为我不知道在Binding 的第二列中输入什么DataGrid。我该怎么做?

我的视图模型

public class MyViewModel() : INotifyPropertyChanged
{
     private ObservableCollection<string> _complaints;

     public ObservableCollection<string> Complaints
     {
          get
          {
               return _complaints;
          }
          set
          {
               _complaints = value;
               NotifyPropertyChanged("Complaints");
          }
     }

}

我的数据网格

<DataGrid x:Name="dg_pc" ItemsSource="{Binding Path=Complaints}" Grid.Column="0">
    <DataGrid.Columns>
        //Checkbox Template Column.
        <DataGridTemplateColumn Width="6.5217*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox x:Name="cb_datagrid" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        //This is the column, where I need to display the **Complaint** Collection
        <DataGridTextColumn Width="93.4782*"Header="Complaints" />
    </DataGrid.Columns>
</DataGrid>

【问题讨论】:

  • 好吧,如果你能提供一些代码,那将会很有用。但这里有一个猜测:您是否将网格 DataContext 设置为“投诉”?
  • 添加了代码。
  • 输出窗口中有什么关于数据错误的信息吗?
  • 不,与此无关。
  • 我可以看到网格中的数据网格行,因为数据存在,但实际上看不到数据,因为在带有Complaints 标题的列中没有任何绑定。

标签: c# .net wpf mvvm datagrid


【解决方案1】:

您需要设置DataGridTextColumn 的Binding 属性。此绑定与源集合的数据项相关。由于您的源集合本身就是您要在列中显示的项目,因此绑定将是项目本身。

<DataGridTextColumn Width="93.4782*" Header="Complaints" Binding="{Binding}"/>

或等效:

<DataGridTextColumn Width="93.4782*" Header="Complaints" Binding="{Binding Path=.}"/>

通常,对于 DataGrid,您将绑定到具有各种属性的对象集合,您希望在列中显示每个对象,而不仅仅是字符串集合。

型号:

public class Complaint : INotifyPropertyChanged
{
    public bool IsActive { get; set; }
    public string Content { get; set; }
    ...
}

查看模型:

public class ComplaintsViewModel
{
    public ObservableCollection<Complaint> Complaints { get; set; }
    ...
}

查看:

<DataGrid ItemsSource="{Binding Complaints}">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Header="Active" Binding="{Binding IsActive}"/>
        <DataGridTextColumn Header="Content" Binding="{Binding Content}"/>
    </DataGrid.Columns>
<DataGrid/>

【讨论】:

  • 是的,谢谢,它做到了。是的,我的其他数据网格都绑定到对象集合,只有这个。
猜你喜欢
  • 2021-05-29
  • 1970-01-01
  • 2013-09-07
  • 2014-08-23
  • 1970-01-01
  • 2016-08-28
  • 2012-12-19
  • 2018-12-10
相关资源
最近更新 更多