J'ai un TreeView
que j'ai (enfin) pu remplir à partir d'une base de données en utilisant la liaison de données.WPF: TreeView dans MVVM
Il y a 2 objets qui vivent dans l'arbre:
- FavoriteFolder - un objet qui peut avoir des enfants: soit des dossiers ou des rapports.
- FavoriteReport - un objet qui ne peut pas avoir d'enfants: lorsqu'un utilisateur clique sur cet élément, il va générer un rapport.
Actuellement, j'ai une configuration de type Model-View (je pense), et je voudrais changer à MVVM pour que je puisse faire des choses avec les TreeView
-articles plutôt que de les afficher simplement.
J'ai regardé de nombreux exemples, mais je suis encore nouveau pour MVVM et WPF en général, de sorte que toute orientation pour mon exemple particulier serait très apprécié
Mes deux classes qui existent dans le TreeView
sont:
éléments du dossier:
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);
}
}
éléments de rapport:
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; }
}
}
Et les 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;
}
}
Je ne suis pas non plus un expert en conception, mais cela n'aurait-il pas beaucoup de sens que votre logique d'accès aux données soit séparée de votre modèle? –
Je suis d'accord, pensez-vous de créer une classe séparée qui s'interface avec la base de données qui avait des méthodes pour renvoyer des éléments enfants ou quelque chose? – ChandlerPelhams