我正在使用MVVM模式和实体框架开发WPF应用程序。我写了一个包含一堆从数据库中填充的列表的类。这些列表用于填充ComboBoxes
和其他`ItemsControls。
这是基本结构:
namespace MiniManager.ViewModel
{
public class LookupLists
{
public LookupLists()
{
using (var db = new ModelContext())
{
Supervisors = db.Users.ToList().Where(u => u.Supervisor);
// More lists...
}
}
public IEnumerable<User> Supervisors { get; set; }
// More lists...
}
}
我在视图中使用这样的类:
<UserControl.Resources>
<lists:LookupLists x:Key="LookupLists"/>
</UserControl.Resources>
当我需要在控件上使用它时,我绑定到资源中的属性:
<ComboBox ItemsSource="{Binding Source={StaticResource LookupLists},
Path=Supervisors}"/>
我的问题是:
LookupLists
对象持续多长时间?LookupLists
的新实例(因此查询了数据库)?答案 0 :(得分:3)
Resources
中声明的项目将添加到FrameworkElement
成员的特殊集合中。因此,只要控件执行,该集合就会存在。
除非控件被销毁,否则不会进行任何其他查询(除非您当然是这样做的。)
有关Resources
媒体资源的更多信息,请参阅MSDN。
答案 1 :(得分:2)
这取决于您声明资源的 where 和 :
其中:
如果您将其声明为UserControl
的本地资源,那么它将主要由此对象引用,并且只要对象持续且 GC 无法收集内存
如果您在App.xaml
文件中将其声明为全局资源,那么它将在应用程序的整个生命周期内可用
如何:
默认情况下,资源是共享,因此只创建一个实例并且每个引用都是如此,例如通过StaticResource
,指向同一个唯一对象
如果您将资源声明为x:Shared="False"
,那么每个引用都会触发生成新实例