创建自定义数据网格的项源

本文关键字:网格 数据网 自定义 数据 创建 | 更新日期: 2023-09-27 18:35:18

我正在使用 DataGrids,但我正在努力绑定我的数据,因为列数因必须显示的信息而异。

因此,我尝试做的是创建和对象,其中包含我在某个时候需要的所有列和行,并将该对象绑定到 ItemsSource 属性。由于我在WindowsForms中使用过DataGridViews,我想到了这样的东西:

DataTable myTable = new DataTable();
DataColumn col01 = new DataColumn("col 01");
myTable.Columns.Add(col01);
DataColumn col02 = new DataColumn("col 02");
myTable.Columns.Add(col02);
DataRow row = myTable.NewRow();
row[0] = "data01";
row[1] = "data02";
myTable.Rows.Add(row);
row = myTable.NewRow();
row[0] = "data01";
row[1] = "data02";
myTable.Rows.Add(row);

但是我一直无法找到在 WPF 中做同样事情的方法,因为我需要一些列来成为 DataGridComboBoxColumns。

实际上,我

在这个网站上阅读了很多关于它的帖子,但没有一个对我有帮助。我真的迷茫了。

谁能帮我?我只需要能够创建一个可能包含DataGridTextColumns或'DataGridComboBoxColumns等的表,以便将此最终对象绑定到DataGrid的ItemsSource属性。

希望有人能帮助我。

创建自定义数据网格的项源

好的,让我尝试举一个类似于您需求的示例

假设我们使用这个类:

public class MyObject
{
   public int MyID;
   public string MyString;
   public ICommand MyCommand;
}

我们愿意显示一个列出 ID 的DataGrid,并具有第二列 Button ,属性MyString作为内容,单击该属性时,它会启动ICommand MyCommand,该在新窗口中打开您想要的任何内容。

以下是您应该在视图侧拥有的内容:

    <DataGrid ItemsSource="{Binding MyList}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Binding="{Binding MyID}" />
            <DataGridTemplateColumn Header="Buttons">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="{Binding MyString}" Command="{Binding MyCommand}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

这将显示一个DataGrid,该获取名为"MyList"的IEnumerable<MyObject>中的所有内容,并显示之前定义的两列。

现在,如果您需要定义命令。首先,我建议您阅读此 MVVM 介绍性链接并参加RelayCommand类(这就是我们将用于解决您的问题的课程)

因此,在您的ViewModel中,定义MyList的对象,以下是您应该如何定义一些有用的对象:

public ObservableCollection<MyObject> MyList { get; set; }
// blah blah blah
public void InitializeMyList()
{
  MyList = new ObservableCollection<MyObject>();
  for (int i = 0; i < 5; i++)
  {
    MyList.Add(InitializeMyObject(i));
  }
}
public MyObject InitializeMyObject(int i)
{
  MyObject theObject = new MyObject();
  theObject.MyID = i;
  theObject.MyString = "The object " + i;
  theObject.MyCommand = new RelayCommand(param =< this.ShowWindow(i));
  return theObject
}
private void ShowWindow(int i)
{
  // Just as an exammple, here I just show a MessageBox
  MessageBox.Show("You clicked on object " + i + "!!!");
}
绑定

到自定义对象的 ObservableCollection 的简单示例。 向自定义对象添加更多属性,以匹配您希望行的外观。

 using System.Collections.ObjectModel;
 public MyClass
 {
      public ObservableCollection<MyObject> myList { get; set; }
      public MyClass()
      {
           this.DataContext = this;
           myList = new ObservableCollection<MyObject>();
           myList.Add(new MyObject() { MyProperty = "foo", MyBool = false };
           myList.Add(new MyObject() { MyProperty = "bar", MyBool = true };
      }
 }
 public MyObject
 {
      public string MyProperty { get; set; }
      // I believe will result in checkbox in the grid
      public bool MyBool { get; set; }
      //...as many properties as you want
 }

使用 XAML

  <DataGrid ItemsSource= "{Binding myList}" />

可能是一些小的语法错误,我完全在 SO 窗口中编写。

我是WPF的新手,并使用Damascus的示例来学习List与数据网格的绑定。 但是当我使用他的答案时,我发现我的数据网格会填充正确的行数,但不会填充 MyObject 类中的任何属性。 我做了更多的搜索,然后偶然发现了我必须做的事情。

我必须封装 MyObject 类属性才能显示它们。 仅仅让他们公开是不够的。

以前:

public class MyObject
{
   public int MyID;
   public string MyString;
   public ICommand MyCommand;
}

后:

public class MyObject
{
    private int _myID;
    public int MyID
    {
        get { return _myID; }
        set { _myID = value; }
    }
    private string _myString;
    public string MyString
    {
        get { return _myString; }
        set { _myString = value; }
    }
    private ICommand _myCommand;
    public ICommand MyCommand
    {
        get { return _myCommand; }
        set { _myCommand = value; }
    }
}
谢谢

大马士革的一个很好的例子,谢谢但丁的一个很好的问题。 我不知道这是否是由于自您的帖子以来版本发生了变化,但希望这将帮助像我这样的 WPF 新手。