我来自VB.Net WinForms。现在我想在WPF中编写一个小应用程序,在datagridview中列出一些文件。我使用了WPF的DataGrid,创建了一些Columns。然后无法添加我的行。
那么,您能帮我选择正确的方法来将我的文件名,状态文本和缩略图添加到DataGrid行吗?
在VB.Net WinForms中我可以添加如下行:
Datagridview1.Rows.add(Myvalue, "RowStateText", "Hello World", MyDate)
在WPF的DataGrid中我可以添加
DataGrid1.Items.Add(New DataGridRow())
但是如何填充我的DataGridRow?
Private Sub AddFilesAndFolders(ByVal Base As IO.DirectoryInfo, ByRef dgv As DataGrid)
'For Each di As IO.DirectoryInfo In Base.GetDirectories
' Call AddFilesAndFolders(di, dgv)
'Next
Dim item As DataGridRow
For Each fi As IO.FileInfo In Base.GetFiles
item = New DataGridRow'<-- test 1 (row is added but empty)
Dim di As New MyFileInfo'<-- test 2 (my own class with public members, but how to add as row with declared columns?)
di.FileName = fi.FullName
di.FileDate = fi.LastAccessTime
item.Item = fi.FullName
dgv.Items.Add(di)
Next
End Sub
答案 0 :(得分:1)
嗨:你应该设置一个ItemsSource而不是手动添加项目。如果列设置正确,那么它将“正常工作”!
dbv.ItemsSource = Base.GetFiles
或
dbv.ItemsSource = CreateMyFileInfos(Base.GetFiles)
如果您还有其他问题,请回复此处。
编辑:在第二次检查时,您可能希望以递归方式执行此操作。在这种情况下,您的AddFilesAndFolders
可以是CreateFilesAndFolders
,它将返回FileInfo / MyFileInfo对象的集合,并递归地与子文件夹生成的集合合并;然后将从第一次调用返回的整个列表绑定到网格。
希望有所帮助!
答案 1 :(得分:0)
WPF是一种心态变化,你需要摆脱Winforms的思维方式。
最终你需要将ItemsSource设置为IEnumerable,最好是ObservableCollection。
最快的入门方法是将ObservableCollection作为公共属性放在代码隐藏文件中:
public ObservableCollection<DirectoryInfo> files { get;set; }
然后在构造函数或Window上的Load事件中,使用您的数据填充集合,然后添加到DataGrid的Xaml声明中:
ItemsSource = "{Binding Path=files}"
编辑:
我使用DirectoryInfo类尝试了这一点,在我添加的代码后面添加了:
public ObservableCollection<DirectoryInfo> Dir = new ObservableCollection<DirectoryInfo>();
public Window1()
{
InitializeComponent();
Dir.Add(new DirectoryInfo("c:\\"));
Dir.Add(new DirectoryInfo("c:\\temp\\"));
dataGrid1.ItemsSource = Dir;
}
由于某些原因,这不能通过Xaml使用数据绑定,但我并没有非常努力地让它工作。