[英]WPF: TreeView in MVVM
我有一个TreeView
(最终),我可以使用数据绑定从数据库中填充它。
树中有2个对象:
目前,我有一个Model-View类型设置(我认为),我想将其更改为MVVM,这样我就可以使用TreeView
-items进行操作,而不仅仅是显示它们。
我看了很多示例,但是总体上我还是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;
}
}
我的第一个建议是加入MVVM工具包,因为它比您自己要做的一切都要容易(例如,实现INotifyPropertyChanged
接口)。 我使用Laurent Bungion的MVVM Light 。
假设您使用的是MVVM Light(如果使用其他工具包,则可以从中推断)...
因此,要将其转换为MVVM,您需要做一些事情。
创建定义的Models
。 我通常使用POCO,只需定义模型的属性即可。 这意味着抽象出您的数据访问层(更多内容请参见下文)。
创建您的ViewModel
。 在这里,您可以拥有自己要绑定的属性。 您的ObservableCollections
将坐在这里。 初始化您创建的类的实例将在此处进行。 调用您的DAL层将在此处进行。 (例如,而不是在视图的构造函数中)。
将此ViewModel
添加到您的ViewModelLocator
(我使用MVVM Light中提供的mvvmlocatorproperty
代码段)。
使用Locator
将View
绑定到ViewModel
。 在您的UserControl
,您可以在声明中添加以下内容:
DataContext="{Binding YourViewModel, Source={StaticResource Locator}}"
我会听布伦南·文森特的建议。 我通常创建一个服务接口(注意:不是一个类,而是一个接口)来定义我的DAL(数据访问层)将具有的方法。 我这样做是为了考虑可混合性,也就是设计时间数据。 如果您不熟悉接口,那么也许简单地DAL类是开始的好方法。 然后,我使用依赖项注入(DI)注入我的DAL服务的实例。 DI非常简单-在ViewModelLocator
您需要更新(实例化)您的DAL服务类并通过vm = New ViewModel(MyDALService dalService)
调用传递它。 显然,您还需要在ViewModel
构造函数中接受MyDALService
引用。 这是我从事的项目上的EquipmentViewModel
构造函数的示例:
public EquipmentViewModel(Services.IEquipmentService equipmentService) { EquipmentService = equipmentService; LoadData(); }
此ViewModel
接受IEquipmentService
类型的参数(这是我的界面)。 在LoadData
方法中,我调用命中数据库层的DAL的EquipmentService.GetEquipment()
方法。
有任何问题让我知道。 MVVM可能会很痛苦,但我很高兴自己坚持了下来。 祝好运。 :)
Josh Smith对如何使用MVVM简化TreeView作了明确的描述。我可以添加的内容不多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.