创建一个自定义DataGrid的ItemsSource

Dan*_*nte 2 c# data-binding wpf datagrid

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

但是我无法找到一种在WPF中执行相同操作的方法,因为例如,我需要一些列作为DataGridComboBoxColumns。

实际上,我已经在该站点上阅读了很多有关它的文章,但是没有一个对我有帮助。我真的迷路了。

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

希望可以有人帮帮我。

Dam*_*cus 5

好吧,让我尝试举一个与您的需求相似的例子

假设我们使用此类:

public class MyObject
{
   public int MyID;
   public string MyString;
   public ICommand MyCommand;
}
Run Code Online (Sandbox Code Playgroud)

而且,我们愿意显示DataGridID 的列表,并在第二栏中显示a 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>
Run Code Online (Sandbox Code Playgroud)

这将显示一个名为“ MyList”的DataGrid所有内容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 + "!!!");
}
Run Code Online (Sandbox Code Playgroud)