创建自定义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新手。