2010-07-16 2 views
0

Я из VB.Net WinForms. Теперь я хотел написать небольшое приложение в WPF, в котором перечислены некоторые файлы в datagridview. Я использовал DataGrid WPF, создал несколько столбцов. А потом не удалось добавить мои строки.WPF DataGrid Row добавить в codebehind

Пожалуйста, не могли бы вы выбрать правильный способ получить мои имена файлов, текст состояния и миниатюры, добавленные в строку DataGrid?

В VB.Net WinForms я могу добавить строку, как это:

Datagridview1.Rows.add(Myvalue, "RowStateText", "Hello World", MyDate) 

В DataGrid WPF, я могу добавить

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

Хорошо. Теперь я решил добавить текущее состояние проекта в качестве загрузки: http://www.goldengel.ch/temp/FileContent%20Replacer.zip – Nasenbaer

ответ

1

Hi: вы должны установить ItemSource вместо добавления элементов вручную. Если столбцы настроены правильно, это будет просто «работать»!

dbv.ItemsSource = Base.GetFiles 

или

dbv.ItemsSource = CreateMyFileInfos(Base.GetFiles) 

Если у вас есть какие-либо другие проблемы, пожалуйста, напишите сюда.

Редактировать: при втором осмотре похоже, что вы можете делать это рекурсивно. В таком случае ваш AddFilesAndFolders мог бы быть CreateFilesAndFolders, который возвратил бы коллекцию объектов FileInfo/MyFileInfo, рекурсивно объединенных с коллекциями, создаваемыми дочерними папками; затем свяжите весь список, возвращенный с первого вызова, в сетку.

Надеюсь, что это поможет!

+0

Привет, Кирэн. Сначала я попробовал ваш образец: dbv.ItemsSource = Base.GetFiles. Но это уже не сработало. Я вам скажу, может быть функция CreateMyFileInfos(), как dgv знает, в каком столбце задаются данные? Я не могу использовать List (Of MyClass), могу ли я? – Nasenbaer

+0

Вы настроили столбцы для своего DataGridView в XAML? Это указывает, какой контроль будет отображаться в каждом столбце –

+0

Это мой XAML. < DataGridTextColumn Header = "Content" /> Nasenbaer

0

WPF - это изменение мышления, вам нужно уйти от способа мышления Winforms.

В конечном счете вам необходимо установить ItemsSource в IEnumerable, желательно ObservableCollection.

Самый быстрый способ начать бы поставить ObservableCollection в качестве публичной собственности в ваш файл кода:

public ObservableCollection<DirectoryInfo> files { get;set; } 

Затем в конструкторе или событие Load в окне, заполнить коллекцию ваши данные, а затем добавить к объявлению Xaml для DataGrid:

ItemsSource = "{Binding Path=files}" 

EDIT:

Я попытался это с помощью класса DirectoryInfo, м у кода за I добавил:

public ObservableCollection<DirectoryInfo> Dir = new ObservableCollection<DirectoryInfo>(); 
    public Window1() 
    { 
     InitializeComponent(); 
     Dir.Add(new DirectoryInfo("c:\\")); 
     Dir.Add(new DirectoryInfo("c:\\temp\\")); 
     dataGrid1.ItemsSource = Dir; 
    } 

По какой-то причине это не работает, используя Databinding через Xaml, но я не очень сильно постараться, чтобы заставить его работать.

+0

Спасибо, Бен. Я уверен, что вы правы, я должен напомнить мне. Пожалуйста, сделайте короткий пример. Где я должен поставить флаг Ovservable? И как получить отдельные строки тогда (не только DirectoryInfo). public ObservableCollection файлы {get; set; } ? – Nasenbaer

+0

В моем XAML у меня нет свойства ItemSource. Или где установить? – Nasenbaer

+0

Если данные в вашем собственном объекте, используемом для коллекции, изменяются во время выполнения, вы должны сделать его ObservableObject и создать changechange для каждого значения внутри него. Затем DataGrid автоматически отразит эти изменения. – Johncl

Смежные вопросы