我有一个包含两列的dataGrid
,我想在我的.cs文件中添加行,dataGrid1.Items.Add()
.
我知道它接受一个对象,但它如何确定要接受对象中的哪个值?仅仅创建一个泛型类只是为了将新行放入 dataGrid 感觉很混乱,有没有其他方法可以做到这一点?
所以下面我有一个通用对象,我该如何使它.Add
将名称和年龄添加到 dataGrid1 中?
泛型类:
namespace myApp
{
public class generic
{
private string name;
private int age;
public generic(string n, int a)
{
name = n;
age = a;
}
public string getName()
{
return name;
}
public int getAge()
{
return age;
}
}
}
我试过dataGrid1.Items.Add(new Item("Ann", 21))
;//显示一行空单元格。我只是无法理解这是如何工作的
编辑以获取更多信息:
在我的 .xaml 中
<DataGrid x:Name="dataGrid1" VerticalAlignment="Top" />
在我的 cs 文件中:
DataGridTextColumn nameColumn = new DataGridTextColumn();
DataGridTextColumn ageColumn = new DataGridTextColumn();
nameColumn.Header = "name";
nameColumn.Binding = new Binding("name");
dataGrid1.Columns.Add(nameColumn);
ageColumn.Header = "age";
ageColumn.Binding = new Binding("age");
dataGrid1.Columns.Add(ageColumn);
然后我有一个点击功能,每当点击时都会生成一个新的名称和年龄,然后将其添加到 dataGrid1
,DataGrid
将为数据项类中的每个公共属性生成一列(AutoGenerateColumns
应true
;如果没有,请在 XAML 中这样做(,因此您需要相应地添加公共属性。您应该在 XAML 中定义列,并使用此generic
类ObservableCollection
创建主视图模型,而不是手动将它们添加到Items
,但 Rome 不是一天建成的。
此版本的类应该可以工作:
public class generic
{
public generic(string n, int a)
{
name = n;
age = a;
}
public string name { get; set; }
public int age { get; set; }
}
你对这个"混乱"的直觉对于一个相对陌生的人来说是很自然的,但这是错误的。"混乱"的是试图将所有数据存储在用户界面控件中。当你以这种方式编写代码时,一切都会迅速变成一场噩梦。您需要做的一切都涉及编写多行半冗余代码来获取您的数据项并对其进行任何操作。这种做事方式就像把你拥有的所有东西都存放在汽车后备箱里,然后在洗完澡后赤身裸体地跑到街上穿衣服,或者当你需要一个干净的叉子时。当然,您的所有逻辑都会从一个事件处理程序复制并粘贴到下一个事件处理程序,然后稍作修改。
我曾经在90年代称之为"RAD综合症",当时"快速应用程序开发"是VB或Delphi等任何环境的热门流行语。WPF 不鼓励您以这种方式编写代码,这实际上是最好的。可以这样想:当我在 80 年代还是个孩子的时候,结构化编程对我来说似乎有点武断,而面向对象编程后来似乎很奇怪地武断。但是在我习惯了与他们一起工作之后,我发现它们非常有用。与这个MVVM的东西一样。