创建自定义DataGrid的ItemsSource

我正在使用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。

实际上我在这个网站上看过很多关于它的post,但是没有一个对我有帮助。 我真的迷路了。

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

希望可以有人帮帮我。

好的,让我试着举一个类似于你需要的例子

我们假设我们使用这个类:

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

我们愿意显示列出ID的DataGrid ,并将第二列作为Button ,将属性MyString作为内容,单击时,启动ICommand MyCommand ,无论您想要什么,它都会在新窗口中打开。

以下是View端应该具有的内容:

              

这将显示一个DataGrid ,它将IEnumerable中的所有内容命名为“MyList”,并显示之前定义的两列。

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

因此,在ViewModel ,定义MyList那个,下面是你应该如何定义一些有用的对象:

 public ObservableCollection MyList { get; set; } // blah blah blah public void InitializeMyList() { MyList = new ObservableCollection(); 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 myList { get; set; } public MyClass() { this.DataContext = this; myList = new ObservableCollection(); 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

   

可能是一些小的语法错误,我完全在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; } } } 

感谢大马士革的一个很好的例子,感谢Dante提出了一个很好的问题。 我不知道这是否是由于你的post后版本的变化,但希望这将有助于其他像我这样的WPF新手。