I have a TreeView that I (finally) was able to populate from a database using data binding.
There are two objects in the tree:
- FavoriteFolder - an object that can have children: either folders or reports.
- FavoriteReport - an object that cannot have children: when the user clicks on this element, he will run the report.
Currently, I have a Model-View type setting (I think), and I would like to change it to MVVM so that I can do something with TreeView elements, and not just display them.
I looked at a lot of examples, but I'm still new to MVVM and WPF in general, so any guidance for my specific example would be much appreciated
My two classes that exist in TreeView are as follows:
Folder Items:
public class FavoriteFolder { private string _connectionString = new ServerInfo().ConnectionString; private string _folderID; private string _parentID; private string _folderTitle; private ObservableCollection<FavoriteFolder> _folders; private ObservableCollection<FavoriteReport> _reports; private ObservableCollection<object> _children; public FavoriteFolder() { } public ObservableCollection<object> Children { get { _getChildren(); return _children; } } public string FolderID { get { return _folderID; } set { _folderID = value; } } public string ParentID { get { return _parentID; } set { _parentID = value; } } public string FolderTitle { get { return _folderTitle; } set { _folderTitle = value; } } private void _getChildren() { _folders = new ObservableCollection<FavoriteFolder>(); _reports = new ObservableCollection<FavoriteReport>(); using (SqlConnection cnn = new SqlConnection(_connectionString)) { cnn.Open(); string sql = "SELECT * FROM tbl_report_folders where fdr_parent_id =" + _folderID; SqlCommand cmd = new SqlCommand(sql, cnn); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { FavoriteFolder folder = new FavoriteFolder(); folder.FolderID = reader["fdr_folder_id"].ToString(); folder.FolderTitle = reader["fdr_folder_name"].ToString(); folder.ParentID = reader["fdr_parent_id"].ToString(); _folders.Add(folder); } reader.Close(); sql = "SELECT * FROM tbl_reports where rpt_folder_id =" + _folderID; cmd = new SqlCommand(sql, cnn); reader = cmd.ExecuteReader(); while (reader.Read()) { FavoriteReport report = new FavoriteReport(); report.ReportID = reader["rpt_report_id"].ToString(); report.ReportTitle = reader["rpt_report_name"].ToString(); report.ParentID = reader["rpt_folder_id"].ToString(); _reports.Add(report); } }
Report Elements:
public class FavoriteReport { private string _reportID; private string _parentID; private string _reportTitle; public FavoriteReport() { } public string ReportID { get { return _reportID; } set { _reportID = value; } } public string ParentID { get { return _parentID; } set { _parentID = value; } } public string ReportTitle { get { return _reportTitle; } set { _reportTitle = value; } } }
And MainWindow.xaml.cs -
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); ObservableCollection<object> items = new ObservableCollection<object>(); FavoriteFolder fdr = new FavoriteFolder(); fdr.FolderID = "0"; items = fdr.Children; this.DataContext = items; } }
source share