创建自定义数据网格的项源
本文关键字:网格 数据网 自定义 数据 创建 | 更新日期: 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 新手。