【发布时间】:2011-10-22 13:15:51
【问题描述】:
我正在使用 MVVM 模式开发 WPF 应用程序,我是 learning。它使用 EF4。我正在尝试使用类似的选项卡式文档界面样式;这些选项卡上的几个组合框具有相同的项目源(来自 sql db)。由于这些数据几乎从不更改,因此创建一个存储库对象以在应用程序启动时获取它们似乎是一个好主意,并为每个视图模型重用它们。不管出于什么原因,即使我在构造函数中使用了 new,列表也是连接的。
如果我在一个选项卡上设置绑定组合框,它会在另一个选项卡上设置(或在创建新选项卡时设置)。我不希望这种情况发生,但我不知道为什么会发生。
存储库对象在其他任何事情之前被初始化,并且只保存公共列表。视图只是使用项目源绑定到 ObservableCollection。我正在使用文章中的 ViewModelBase 类。这是 Viewmodel 和模型代码。
视图模型
TicketModel _ticket;
public TicketViewModel(TableRepository repository)
{
_ticket = new TicketModel(repository);
}
public ObservableCollection<Customer> CustomerList
{
get { return _ticket.CustomerList; }
set
{
if (value == _ticket.CustomerList)
return;
_ticket.CustomerList = value;
//base.OnPropertyChanged("CustomerList");
}
}
型号
public ObservableCollection<Customer> CustomerList { get; set; }
public TicketModel(TableRepository repository)
{
CustomerList = new ObservableCollection<Customer>(repository.Customers);
}
编辑:我确定这是错误的做法,我仍在努力。这是新型号代码:
public TicketModel(TableRepository repository)
{
CustomerList = new ObservableCollection<Customer>((from x in repository.Customers
select
new Customer
{
CM_CUSTOMER_ID = x.CM_CUSTOMER_ID,
CM_FULL_NAME = x.CM_FULL_NAME,
CM_COMPANY_ID = x.CM_COMPANY_ID
}).ToList());
}
这会导致一个新问题。每当您更改选项卡时,组合框上的选择都会被清除。
更多编辑: This question 我在使用时遇到 Rachels 的回答表明静态存储库是不好的做法,因为它在程序的生命周期内保持数据库连接处于打开状态。我确认一个连接仍然打开,但看起来一个连接对于非静态类也仍然打开。这是存储库代码:
using (BT8_Entity db = new BT8_Entity())
{
_companies = (from x in db.Companies where x.CO_INACTIVE == 0 select x).ToList();
_customers = (from x in db.Customers where x.CM_INACTIVE == 0 orderby x.CM_FULL_NAME select x).ToList();
_locations = (from x in db.Locations where x.LC_INACTIVE == 0 select x).ToList();
_departments = (from x in db.Departments where x.DP_INACTIVE == 0 select x).ToList();
_users = (from x in db.Users where x.US_INACTIVE == 0 select x).ToList();
}
_companies.Add(new Company { CO_COMPANY_ID = 0, CO_COMPANY_NAME = "" });
_companies.OrderBy(x => x.CO_COMPANY_NAME);
_departments.Add(new Department { DP_DEPARTMENT_ID = 0, DP_DEPARTMENT_NAME = "" });
_locations.Add(new Location { LC_LOCATION_ID = 0, LC_LOCATION_NAME = "" });
但是,现在我回到上面的丑陋代码,这似乎不是复制集合的好解决方案,因为客户对象需要在任何需要它的代码中逐个属性地手动重新创建。看来这应该是一件很常见的事情,重复使用列表,我觉得应该有解决办法。
【问题讨论】:
-
加载静态列表一次,然后关闭连接有什么问题?列表的静态类不是存储库,因为它不用于添加/编辑/删除项目,它只是一个包含一些静态列表的类。
-
因为似乎即使使用
using块,与数据库的连接仍保持打开状态。除非有明确的方法让 EF 关闭其连接,否则这不是一个好习惯。 -
过去,我为我的 DataContext 使用了
using块并将context.Entities.ToList()返回到静态列表。这会将实体与上下文断开连接并关闭连接。所以我的静态类会说CustomerList = DAL.GetCustomers();,而我的DAL类上的静态GetCustomers()方法类似于List<Customers> list; using (var context as new MyEntities) { list = context.Customers.ToList(); } return list;
标签: wpf mvvm observablecollection