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属性。
希望可以有人帮帮我。
好吧,让我尝试举一个与您的需求相似的例子
假设我们使用此类:
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)
| 归档时间: |
|
| 查看次数: |
26062 次 |
| 最近记录: |