2016-09-22 283 views
0

我是WPF的新手,尝试将程序从WinForms转换为WPF。我遇到了一个呃试图从DataGridView转换到DataGrid并添加行。任何帮助表示赞赏。向WPF DataGrid添加空行,然后编辑单元格

原始代码:

for (int i = 0; i < noteArray.Count; i++) 
     { 
      int newIndex = dtgrdNotes.Rows.Add(); 
      dtgrdNotes.Rows[newIndex].Cells[0].Value = noteArray[i].ToString(); 
      dtgrdNotes.Rows[newIndex].Cells[1].Value = chkbx1.Checked; 
      dtgrdNotes.Rows[newIndex].Cells[2].Value = chkbx2.Checked; 
     } 

我需要的代码在WPF工作,我已经试过的dtgrdNotes.Items甚至DataRowView的不同的变化,但迄今没有奏效。有什么建议么?

更新* XAML,与控制问题无二理查德:

<DataGrid Name="dtgrdNotes" Height="178" Width="739" HorizontalAlignment="Right" VerticalAlignment="Bottom" Canvas.Left="1" IsEnabled="False" > 
    <DataGrid.Columns> 
     <DataGridTextColumn x:Name="dgtxtbxNote" Width="*" Binding="{Binding note}"/> 
     <DataGridCheckBoxColumn x:Name="dgchbxInquire" Width="100" Binding="{Binding inquire}" /> 
     <DataGridCheckBoxColumn x:Name="dgchbxPrint" Width="100" Binding="{Binding print}" /> 
     <DataGridTemplateColumn x:Name="dgbtncDelete" Width="80" Header="Button"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Button x:Name="dgbtncDeleteButton" Content="Delete" Width="50px" Height="10px" FontWeight="Bold" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

回答

0

在WPF,数据控件必须绑定到数据的集合,通常是观察集合。 您可以尝试创建一个具有一个或多个空链接数据和控件的集合。 Datagrid必须与您使用的模型相同。 我会离开你一个例子:

的Datagrid:

<DataGrid x:Name="dtgPersons" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Id" Width="1*" Binding="{Binding Id}"/> 
     <DataGridTextColumn Header="Name" Width="2*" Binding="{Binding Name}"/> 
     <DataGridTextColumn Header="Last Name" Width="2.5*" Binding="{Binding LastName}"/> 
     <DataGridTextColumn Header="Age" Width="1*" Binding="{Binding Age}"/> 
     <DataGridCheckBoxColumn Width="*" Binding="{Binding Status}" Header="Status"/> 
     <DataGridTemplateColumn Width="*" Header="Action"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Button Content="Delete" Click="Button_Click"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

型号:

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
    public bool Status { get; set; } 
} 

代码:

public MainWindow() 
{ 
    InitializeComponent(); 

    ObservableCollection<Person> Persons = new ObservableCollection<Person>(); 

    for(int i = 0; i < 10; i++) 
    { 
     Person p = new Person(); 
     p.Id = i; 
     p.Age = i + 10; 
     p.Name = "Name " + i; 
     p.LastName = "LastName " + i; 
     p.Status = true; 

     Persons.Add(p); 
    } 

    dtgPersons.ItemsSource = Persons; 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var person = dtgPersons.SelectedItem as Person; 
    MessageBox.Show(person.Name + " will be removed"); 
} 

,结果:

enter image description here

enter image description here

+0

所以,在这个例子中,我可以通过创建一个新的“人”,然后补充说,人可观察集合添加一个新行,每当我想要的吗? – Hank

+0

是的。一个好处是,如果您编辑视图,集合会自动查看更改 – Richard

+0

我不确定是否应该为此提出新问题,但也许您会知道。我试图实现类似于你的例子,但与列中的内容是控件(复选框,按钮等)每次我尝试,我得到出现在单元格中是“System.WIndows.Controls.CheckBox “或”System.WIndows.Controls.Button“而不是实际的控制。我已经正确地更改了类变量类型,并且在将它添加为DataGrid ItemsSource之前,它确实显示为我的类的一部分。该列在XAML中也适用于复选框。有任何想法吗? – Hank