У меня есть TreeView
, который я (наконец) смог заполнить из базы данных, используя привязку данных.
В дереве есть 2 объекта:
- FavoriteFolder - объект, который может иметь дочерние элементы: папки или отчеты.
- FavoriteReport - объект, который не может иметь дочерних элементов: когда пользователь нажимает на этот элемент, он запускает отчет.
В настоящее время у меня есть настройка типа Model-View (я думаю), и я хотел бы изменить ее на MVVM, чтобы я мог делать вещи с TreeView
-элементами, а не просто отображать их.
Я посмотрел много примеров, но я все еще новичок в MVVM и WPF в целом, поэтому любые рекомендации для моего конкретного примера будут высоко оценены
Мои два класса, которые существуют в TreeView
:
Папка:
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);
}
}
//add the children to the collection
foreach (var folder in this._folders)
_children.Add(folder);
foreach (var report in this._reports)
_children.Add(report);
}
}
Элементы отчета:
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; }
}
}
И 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;
}
}