XAML 如何实例化对象
本文关键字:对象 实例化 XAML | 更新日期: 2023-09-27 18:21:00
我正在使用MVVM模式和实体框架开发一个WPF应用程序。 我编写了一个类,其中包含一堆从数据库填充的列表。 这些列表用于填充ComboBoxes
和其他"项目控件"。
以下是基本结构:
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
对象持续多长时间?- 只要 UI 处于活动状态?
- 是否在每次视图需要时创建
LookupLists
的新实例(因此查询数据库(?
在 Resources
中声明的项目将添加到作为 FrameworkElement
成员的特殊集合中。因此,只要控件存在,集合就会存在。
除非销毁控件,否则不会进行其他查询(当然,除非您进行查询(。
有关存储这些属性的 Resources
属性的详细信息,请参阅 MSDN。
这取决于您声明资源的位置和方式:
哪里:
-
如果将其声明为
UserControl
的本地资源,则它将主要由此对象引用,并且只要对象持续并且GC不收集内存,它就会持续存在
。 如果在
App.xaml
文件中将其声明为全局资源,则它将在应用程序的整个生存期内可用
如何:
-
默认情况下,资源是共享的,因此只创建一个实例,并且每个引用(例如通过
StaticResource
(都指向同一个唯一对象 -
如果将资源声明为
x:Shared="False"
则每个引用都将触发新实例的生成